Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Parameterübergabe von externem Programm an Delphifunktion (https://www.delphipraxis.net/162415-parameteruebergabe-von-externem-programm-delphifunktion.html)

UweJansen 22. Aug 2011 12:25

Delphi-Version: XE

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-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

DeddyH 22. Aug 2011 12:29

AW: Parameterübergabe von externem Programm an Delphifunktion
 
Hallo und Willkommen in der DP :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.

UweJansen 22. Aug 2011 12:35

AW: Parameterübergabe von externem Programm an Delphifunktion
 
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

DeddyH 22. Aug 2011 12:36

AW: Parameterübergabe von externem Programm an Delphifunktion
 
Genau so. Ich weiß, das ist u.U. viel Arbeit, aber da musst Du leider durch.

UweJansen 22. Aug 2011 13:12

AW: Parameterübergabe von externem Programm an Delphifunktion
 
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

DeddyH 22. Aug 2011 13:15

AW: Parameterübergabe von externem Programm an Delphifunktion
 
Versuch es doch mal mit CreateProcessA.

himitsu 22. Aug 2011 13:28

AW: Parameterübergabe von externem Programm an Delphifunktion
 
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. :wink:


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)

UweJansen 22. Aug 2011 13:39

AW: Parameterübergabe von externem Programm an Delphifunktion
 
@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


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:36 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