AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Parameterübergabe von externem Programm an Delphifunktion
Thema durchsuchen
Ansicht
Themen-Optionen

Parameterübergabe von externem Programm an Delphifunktion

Ein Thema von UweJansen · begonnen am 22. Aug 2011 · letzter Beitrag vom 22. Aug 2011
Antwort Antwort
UweJansen

Registriert seit: 22. Aug 2011
Ort: NRW
13 Beiträge
 
Delphi 11 Alexandria
 
#1

Parameterübergabe von externem Programm an Delphifunktion

  Alt 22. Aug 2011, 13:25
Delphi-Version: XE
Hallo,

ich bin neu hier im Forum und möchte erst einmal alle Grüßen !

Ich programmiere seit Jahren hauptsächlich in OpenRoad, einer 4GL-Entwicklungsumgebung der Firma Ingres und ein wenig in Delphi,
allerdings bisher "nur" in Delphi5 !!

In Delphi(5) habe ich in eine DLL einige Funktionen (z. B. für Dateioperationen) ausgelagert die ich in der OpenRoad-Entwicklungs-
umgebung nicht umgesetzt bekomme.

Unser eigentlicher Delphiprogrammierer hat vor 2 Jahren das Unternehmen verlassen und von daher stehe ich mit meinem Problem zur
Zeit alleine da.
Ich habe jetzt (versucht) von Delphi5 auf Delphi XE umzusatteln (also einen Versionssprung von ca. 10 Jahren vollzogen) und stosse
jetzt als erstes schon auf das Riesenproblem das die Parameterübergabe zwischen dem aufrufenden OpenRoad-Programm und der Delphi-
DLL-Funktion nicht mehr funktioniert, d. h. der übergebene Parameterwert kommt nicht an !

Hier mal der Quellcode von Delphi:

Delphi-Quellcode:
unit untFilFn;

interface

uses
  Windows, Messages, SysUtils, Forms, FileCtrl, Dialogs;

type
  stgString1 = Array[0..255 ] of Char;
  stgErrStrg = Array[0..2058] of char;

...

{Export-Funktionen der DLL}

function FilExi(FilName: stgString1 ): SmallInt; export; pascal;

...

implementation

uses untStgUtils;

...

// Überprüfen ob eine Datei vorhanden ist

function FilExi(FilName: stgString1 ): SmallInt; export; pascal;
var
  stgDateiName1: string ;
  intCount : integer;
begin
  Result := 0;

  for intCount := 0 to 255 do
   if FilName[intCount] in [#33..#127] then
             stgDateiName1 := stgDateiName1 + FilName[intCount];

  showmessage(stgDateiName1);

  if FileExists (FilName) then Result := 1;
end;

...
Das "ShowMessage" habe ich einfach als Debuggingcode eingefügt um zusehen was in der Funktion ankommt.
Diese Syntax hat mit "Delphi 5" immer funktioniert jetzt aber nicht mehr !
Woran kann das liegen ? Müssen in den Projektoptionen irgendwelche Schalter (anders) gesetzt werden ?

Wenn mir einer einen Tip geben kann wäre ich sehr glücklich ... ich steh echt auf dem Schlauch !

Besten Dank im voraus !

Grüße
Uwe
Uwe

Geändert von UweJansen (22. Aug 2011 um 16:22 Uhr) Grund: Delphi-Tags gesetzt - nächstes mal bitte selbst machen
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

AW: Parameterübergabe von externem Programm an Delphifunktion

  Alt 22. Aug 2011, 13:29
Hallo und Willkommen in der DP

Dein Problem rührt daher, dass Delphi seit Version 2009 Unicode verwendet, davor war es Ansi. Um nun mit Deiner DLL kompatibel zu bleiben, musst Du alle Strings explizit als AnsiStrings und alle Chars als AnsiChars (dementsprechend auch PChars als PAnsiChars) deklarieren.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
UweJansen

Registriert seit: 22. Aug 2011
Ort: NRW
13 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Parameterübergabe von externem Programm an Delphifunktion

  Alt 22. Aug 2011, 13:35
Hallo DeddyH,

d.h. konkret was ? Entschuldige die vielleicht dumme Frage !

Ich müsste als z. B. die Parameterdefinition

stgString1 = Array[0..255 ] of Char ... in stgString1 = Array[0..255 ] of AnsiChar

ändern oder was ... und überall wo im Code "Char" oder "String" steht "AnsiChar" bzw. "AnsiString" draus machen ?

Grüße
Uwe
Uwe
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#4

AW: Parameterübergabe von externem Programm an Delphifunktion

  Alt 22. Aug 2011, 13:36
Genau so. Ich weiß, das ist u.U. viel Arbeit, aber da musst Du leider durch.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
UweJansen

Registriert seit: 22. Aug 2011
Ort: NRW
13 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Parameterübergabe von externem Programm an Delphifunktion

  Alt 22. Aug 2011, 14:12
Hallo DeddyH,

erst einmal Danke für den Tip ... der war schonmal goldrichtig !

Nun habe ich eine andere Typumwandlungsproblematik !

Ich gebe an einige Funktionen auch einen "Char" (jetzt ja "AnsiChar") mit der leer ist und in dem ich
einen Fehlermeldungstext zurückgeben will.
Dieser Parameter wird an Funktionen (wie zum Beispiel "CreateProcess") weitergegeben.
In der alten Variante mit dem Parametertyp "Char" hat die "automatische" Typumwandlung in das von der
Funktion "CreateProcess" geforderte Format "PWideChar" funktioniert aber wenn ich den Parameter als
"AnsiChar" übergebe klappt dies nicht mehr !
Wie bekomme ich denn aus einem "AnsiChar" String-Array ein "PWideChar" und wieder zurück ?

Sorry nochmal für die vielen "Newbie" Fragen !

Grüße
Uwe
Uwe
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#6

AW: Parameterübergabe von externem Programm an Delphifunktion

  Alt 22. Aug 2011, 14:15
Versuch es doch mal mit CreateProcessA.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen

Geändert von DeddyH (22. Aug 2011 um 14:19 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#7

AW: Parameterübergabe von externem Programm an Delphifunktion

  Alt 22. Aug 2011, 14:28
Und in Zukunft:
Für externe Schnittstellen und beim Speichern/Übertragen von Daten immer nur statische Typen verwenden, welche sich nicht ändern können.
Ansonsten siehst du ja hier, wo das Endet, sobald sich solche Typen doch mal verändern.


Char, PChar, Integer, Cardinal, Real, Pointer, String usw.

z.B.
statisch: AnsiChar und WideChar
dynamisch: Char (dieses mappt der Compiler abhängig vom Zielsystem auf einen der statischen Typen)

Win16: Integer = SmallInt (16 Bit)
Win32: Integer = LongInt (32 Bit)


Zielsystem = Das System, wofür kompiliert wird und nicht wo das Programm wirklich läuft.


Zitat:
CreateProcessA
CreateProcess = dynamisch
CreateProcessA = statisch (ANSI)
CreateProcessW = statisch (Unicode)
$2B or not $2B
  Mit Zitat antworten Zitat
UweJansen

Registriert seit: 22. Aug 2011
Ort: NRW
13 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Parameterübergabe von externem Programm an Delphifunktion

  Alt 22. Aug 2011, 14:39
@DeddyH, @himitsu,


Besten Dank euch beiden ... !!

Ich denke jetzt kriege ich die Kurve !

Ich hab zwar noch 2 weitere Probleme (Austausch von 2 Komponenten aus dem ehemaligen "FastNet" Bereich durch entsprechende
Komponenten aus dem "Indy"-Bereich), aber dafür mache ich wohl besser einen neuen Thread auf wenn ich die String-Änderung-
en überall eingebaut habe !

Grüße
Uwe
Uwe
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz