![]() |
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:
Das "ShowMessage" habe ich einfach als Debuggingcode eingefügt um zusehen was in der Funktion ankommt.
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; ... 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 |
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. |
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 |
AW: Parameterübergabe von externem Programm an Delphifunktion
Genau so. Ich weiß, das ist u.U. viel Arbeit, aber da musst Du leider durch.
|
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 |
AW: Parameterübergabe von externem Programm an Delphifunktion
Versuch es doch mal mit CreateProcessA.
|
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 = statisch (ANSI) CreateProcessW = statisch (Unicode) |
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 03:23 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz