Autor Beitrag
UweJansen
Hält's aus hier
Beiträge: 1



BeitragVerfasst: Mo 22.08.11 13:20 
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:

ausblenden volle Höhe 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..2058of char;

...

{Export-Funktionen der DLL}

function FilExi(FilName: stgString1           ): SmallInt; exportpascal;

...

implementation

uses untStgUtils;

...

// Überprüfen ob eine Datei vorhanden ist

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

  for intCount  := 0 to 255 do
   if FilName[intCount] in [#33..#127then
             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 user profile iconMartok: B- durch Delphi-Tags ersetzt
Moderiert von user profile iconNarses: Topic aus Delphi Language (Object-Pascal) / CLX verschoben am Mo 22.08.2011 um 15:38
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19315
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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.
user profile iconUweJansen hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden Delphi-Quelltext
1:
2:
3:
type
  stgString1 = Array[0..255 ] of AnsiChar;
  stgErrStrg = Array[0..2058of 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.