Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DLL mit LPSTR einbinden (https://www.delphipraxis.net/164470-dll-mit-lpstr-einbinden.html)

hesch21 14. Nov 2011 13:35

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 (www.delcomproducts.com), welche ich einbinden möchte. Als erstes muss man da eine Abfrage auf einen Device vornehmen.
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:
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;
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.

daywalker9 14. Nov 2011 13:38

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

Neutral General 14. Nov 2011 13:43

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;

daywalker9 14. Nov 2011 13:45

AW: DLL mit LPSTR einbinden
 
Zitat:

Zitat von Neutral General (Beitrag 1136101)
Wenn schon, dann @str[0].

Ah natürlich, danke für die Korrektur :-)

hesch21 14. Nov 2011 14:25

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.

Neutral General 14. Nov 2011 14:36

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:
for x := 0 to 511 do DevName[x] := char(32);
durch das

Delphi-Quellcode:
FillChar(DevName[0],SizeOf(DevName),' '); // oder auch FillChar(DevName[0],SizeOf(DevName),32);
ersetzen!

DeddyH 14. Nov 2011 14:39

AW: DLL mit LPSTR einbinden
 
Ich würde es ja so versuchen:
Delphi-Quellcode:
var
  Devicename: String;
begin
  SetLength(Devicename, 512);
  if DelcomGetNthDevice(2, 0, PChar(Devicename)) = 0 then
    // ...
end;
Aber bist Du Dir auch sicher, dass die Aufrufkonvention stimmt? Hast Du es testhalber einmal mit cdecl versucht?

[edit] Wo war der rote Kasten? [/edit]

hesch21 14. Nov 2011 16:24

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