UweJansen - Mo 22.08.11 13:20
Titel: Parameterübergabe von externem Programm an Delphifunktion
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-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44:
| unit untFilFn;
interface
uses Windows, Messages, SysUtils, Forms, FileCtrl, Dialogs;
type stgString1 = Array[0..255 ] of Char; stgErrStrg = Array[0..2058] of char;
...
function FilExi(FilName: stgString1 ): SmallInt; export; pascal;
...
implementation
uses untStgUtils;
...
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
Moderiert von
Martok: B- durch Delphi-Tags ersetztModeriert von
Narses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mo 22.08.2011 um 15:38
jaenicke - Mo 22.08.11 15:33
Hallo und :welcome:
Delphi XE benutzt standardmäßig Unicodestrings, keine Ansistrings. Der Aufruf an die DLL passiert aber vermutlich mit AnsiChars.
UweJansen hat folgendes geschrieben : |
Delphi-Quelltext 1: 2: 3:
| type stgString1 = Array[0..255 ] of AnsiChar; stgErrStrg = Array[0..2058] of Ansichar; | |
Nebenbei würde ich an der Stelle eher PAnsiChar statt diesem komischen eigenen Typ stgString1 benutzen. Oder gleich PWideChar, wenn auch der Aufruf an der anderen Seite ebenfalls geändert werden kann.
Zudem würde ich eher stdcall statt pascal verwenden, damit die DLL auch mit anderen Sprachen verwendbar ist.