![]() |
DLL mit LPSTR einbinden
Hallo allerseits
nun steh ich seit Monaten an und auch der Hersteller der DLL kann mir nicht weiter helfen. Die ganze Suche in den verschiedenen Foren hat auch zu nichts geführt. Es geht um die DELCOMDLL.DLL ( ![]() Funktion: DelcomGetNthDevice( DWORD Type, DWORD Nth, LPSTR Name); Rückgabe dieser Funktion ist ein DWORD mit 0 wenn ok. Das Problem ist beim LPSTR Name. Gemäss Beschreibung im Manual ist dies "The third parameter is a pointer to a string of characters of which must be pre-allocated and must be at least 512 bytes long" Ein 512-Zeichen langer String geht ja in Delphi bekanntlich nicht, also müsste doch irgend etwas mit einem char-array möglich sein, aber ich schaff es einfach nicht. die aktuelle Variante sieht wie folgt aus, das Programm läuft auch problemlos durch, nur eine Device-Nummer wird nie wirklich ausgelesen, resp. zwischengespeichert. Deshalb gibt's auch beim DelcomOpenDevice nie ein Handle zurück.
Code:
Ich vermute, dass ich mal wieder irgendwo was mit Pointern und so übersehen habe, aber wie gesagt, ich bin nicht erst seit einer Viertelstunde am üben. Wenn mir also jemand auf die Sprünge helfen könnte, wäre ich sehr dankbar.
Function DelcomGetNthDevice(ProductType, NthDevice : DWORD; DeviceName : PChar): DWORD; stdcall; external 'DelcomDLL.dll';
Function DelcomOpenDevice(DeviceName : PChar; Mode : DWORD): Integer; stdcall; external 'DelcomDLL.dll'; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var DevName : array [0..511] of char; var x : integer; begin for x := 0 to 511 do DevName[x] := char(32); if DelcomGetNthDevice(2,0, DevName) = 0 then begin ShowMessage(DevName); bHandle := DelcomOpenDevice(DevName, 0); if bHandle = 0 then ShowMessage('Error'); end; end; |
AW: DLL mit LPSTR einbinden
Müsste dann, wenn ich mich nicht täusche so lauten:
Delphi-Quellcode:
var
str : array[0..512] of Char; begin if DelcomGetNthDevice(2,0,@str[0])=0 then |
AW: DLL mit LPSTR einbinden
Wenn schon, dann @str[0].
Ein anderer Vorschlag (Bin mir nicht sicher, ob das geht):
Delphi-Quellcode:
var
str: String; begin SetLength(str,512); if DelcomGetNthDevice(2,0,@str[1])=0 then // ... end; |
AW: DLL mit LPSTR einbinden
Zitat:
|
AW: DLL mit LPSTR einbinden
Erst mal Danke für die schnellen Antworten.
Die Variante mit mit @str[0] als dritten Parameter bringt nicht viel. Da hab ich danach einfach #0 auf der ersten Position des Char-Arrays. Der Vorschlag von Neutral General funktioniert leider auch nicht. Da ist nach dem Funktionsaufruf derselbe Quatsch im String wie zuvor. |
AW: DLL mit LPSTR einbinden
Hast du mal testweise mehr als 512 Bytes reserviert? Da steht ja "at least"!
Ansonsten: Ist die Aufrufkonvention auch tatsächlich stdcall? Denn daran könnte es auch liegen. PS: du kannst
Delphi-Quellcode:
durch das
for x := 0 to 511 do DevName[x] := char(32);
Delphi-Quellcode:
ersetzen!
FillChar(DevName[0],SizeOf(DevName),' '); // oder auch FillChar(DevName[0],SizeOf(DevName),32);
|
AW: DLL mit LPSTR einbinden
Ich würde es ja so versuchen:
Delphi-Quellcode:
Aber bist Du Dir auch sicher, dass die Aufrufkonvention stimmt? Hast Du es testhalber einmal mit cdecl versucht?
var
Devicename: String; begin SetLength(Devicename, 512); if DelcomGetNthDevice(2, 0, PChar(Devicename)) = 0 then // ... end; [edit] Wo war der rote Kasten? [/edit] |
AW: DLL mit LPSTR einbinden
Hallo Detlef
also vorab: Dein Vorschlag haut auch nicht hin. ebenfalls als Resultat #0 im DevName nach dem Funktionsaufruf. Wenn der Aufruf nicht mit True (0) zurück käme, wäre das ja möglich, aber da tatsächlich ein Device an Rechner hängt (mit einem 6-stelligen Device-Namen) und das Hilfsprogramm von Delcom das Teil erkennt, muss irgendwo beim auslesen des Device-Namens der Fehler sein. STDCALL ist klar (etwas vom wenigen was mir Delcom bestätigt hat). Aber wie ich in der Funktions-Definion DeviceName definieren muss, ist nicht so ganz sicher. Im C ist es mit LPSTR definiert und das wird meines Wissens in PChar konvertiert. Und ich habe keine Ahnung, auf was Du Dich mit dem roten Kasten beziehst. Heinz |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:39 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