Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   dll einbinden / Pointer Probleme (https://www.delphipraxis.net/167766-dll-einbinden-pointer-probleme.html)

Pow3rus3r 17. Apr 2012 13:55

dll einbinden / Pointer Probleme
 
Hallo,

ich möchte eine dll, die mit c++ geschrieben wurde in meinem Delphi Programm nutzen. Die DLL habe ich wie folgt eingebunden:
Delphi-Quellcode:
function COM_TcpOpen(const m_hCom:Pointer; const ipAddress:Pchar; port:integer):string; stdcall; external 'HwCom.dll';
Nun gibt es eine c++ Funktion (COM_TcpOpen) in dieser DLL, die folgende Übergabewerte erwartet:
Code:
COM_TcpOpen (COM_Handle * handle, const char * ipAddress, u16 port)
Jedoch habe ich Probleme beim Einbinden der Funktion (ich denke, es liegt an dem ersten Übergabewert). Und zwar bringt mir Delphi immer einen Lesefehler auf Adressbereich xyz (wobei xyz dem Wert des Pointers entspricht. Die Funktion erwartet eigentlich einen "leeren" Pointer, der durch die Funktion gefüllt werden soll.

Der Quelltext meines Delphi Programms sieht zur Zeit wie folgt aus:
Delphi-Quellcode:
procedure TForm1.btnconnectClick(Sender: TObject);
  var
    m_hCom: Pointer;
    ret:string;
    port:smallint;
    iparray:array[0..12] of char;
    ipAddress:PChar;

begin
  m_hCom := NIL;
  port:= 1500;
  ipAddress:=iparray;
  ipAddress[0]:='1';
  ipAddress[1]:='9';
  ipAddress[2]:='2';
  ipAddress[3]:='.';
  ipAddress[4]:='1';
  ipAddress[5]:='6';
  ipAddress[6]:='8';
  ipAddress[7]:='.';
  ipAddress[8]:='1';
  ipAddress[9]:='.';
  ipAddress[10]:='1';
  ipAddress[11]:='5';
  ipAddress[12]:=#0;

  ret := COM_TcpOpen(m_hCom,ipAddress,port);
end;
Hat vielleicht jemand einen Tipp für mich, woran es liegen kann, dass ich ständig Lesefehler bekomme? ich probiere nun schon seit Tagen rum und komme nicht wirklich weiter... Wäre super, wenn jemand helfen könnte. Ich komme eigentlich auch nicht aus der Delphi Ecke.

DeddyH 17. Apr 2012 14:07

AW: dll einbinden / Pointer Probleme
 
Hallo und Willkommen in der DP :dp:,

klappt es so?
Delphi-Quellcode:
function COM_TcpOpen(var m_hCom: THandle; ipAddress:Pchar; port:integer): PChar; stdcall; external 'HwCom.dll';
Allerdings bin ich da auch kein Experte, geb ich zu.

himitsu 17. Apr 2012 14:09

AW: dll einbinden / Pointer Probleme
 
COM_Handle wird doch bestimmt ein VAR-parameter sein. (vermutlich auch eher HANDLE/THandle, anstatt Pointer)

Und wie ist das Result deklariert? (im C-Code ist nix zu sehn)

Wie sieht die Aufrufkonvention aus? (sicher daß es stdcall ist)

Und welche Delphi-Version nutzt du?
PChar ist aber so oder so keine sonderlich guter Idee. Ich würde vermuten, daß wohl eher PAnsiChar gemeint ist.

Pow3rus3r 17. Apr 2012 14:32

AW: dll einbinden / Pointer Probleme
 
@DeddyH: Danke! Leider funktioniert es so auch nicht - ich hatte es auch schon mit THandle statt Pointer probiert - ohne Erfolg.

@himitsu: Mit THandle hatte ich es Anfangs auch probiert - leider brachte das aber kein Erfolg. In der DLL Doku steht folgendes:
"COM_TcpOpen erwartet als handle-Parameter eine Variable vom Typ COM_Handle (z.B. COM_Handle m_hCom;). Diese Variable ist ein Zeiger auf das von der Funktion COM_TcpOpen erzeugte (Ethernet) Interface. Sprich dieser Pointer wird von COM_TcpOpen erst initialisiert(referenziert)."

Deshalb die Idee, ein unreferenziertes Handle zu übergeben - aber anscheinend habe ich da etwas übersehen, denn es passiert nichts.

Als Result ist folgendes deiniert:
Code:
Returns:
COM_RETURN_OK Function executed successfully.
COM_RETURN_Failed The function failed to create a new handle.
Die Aufrufkonvention ist mir gänzlich unbekannt, da keinerlei Dokumentation für diese DLL mit Delphi existieren (und genau das ist mein Problem - denn ich tappe da ziemlich im dunkeln).

Ob PChar so passt, ist auch fragwürdig. Ich habe nur die Information, dass für ipaddress ein nullteminierter String (const char* in c++) erwartet wird. Für Port wird ein unsigned short int erwartet.

Ich benutze Delphi XE (15.0.xxx)

Assarbad 17. Apr 2012 15:08

AW: dll einbinden / Pointer Probleme
 
Würdest du uns bitte den kompletten Prototypen der Funktion in C/C++ geben, sowie den typedef für COM_Handle?

Ggf. laß lieber ein paar Zeilen rundherum mit dabei anstatt zuviel herauszuschnipseln. Ach ja, ein Link zu dem Header würde auch helfen wenn der alternativ vorhanden ist.

Wenn du nur die DLL hast, wird das etwas schwieriger. Man bräuchte mindestens die DLL (klar) um mal in IDA nachzugucken, aber ne Garantie auf ein schnelles Resultat ist das nicht. Kann sein, kann aber auch nicht sein. Wenn du ein Programm hast welches diese DLL benutzt ist es auch sinnvoll dieses beizulegen. Kann man es irgendwo runterladen, gib halt den Link ;)

himitsu 17. Apr 2012 15:25

AW: dll einbinden / Pointer Probleme
 
SHORT in C ist doch in Delphi ein Word/SmallInt? (ShortInt/Byte währe für einen Port eh zu klein)

Und ansonsten hat Assarbad ja noch genügend gesagt. :)

Assarbad 17. Apr 2012 15:44

AW: dll einbinden / Pointer Probleme
 
Zitat:

Zitat von himitsu (Beitrag 1162307)
SHORT in C ist doch in Delphi ein Word/SmallInt?

Jenau. Wobei ich bei SmallInt und ShortInt in Delphi auch immer durcheinander komme, seit ich hauptsächlich nativ mit C/C++ arbeite.

Blup 17. Apr 2012 16:14

AW: dll einbinden / Pointer Probleme
 
Zitat:

Zitat von Pow3rus3r (Beitrag 1162286)
Als Result ist folgendes deiniert:
Code:
Returns:
COM_RETURN_OK Function executed successfully.
COM_RETURN_Failed The function failed to create a new handle.

:glaskugel: Das schaut mehr nach einem Integer-Result aus.

himitsu 17. Apr 2012 18:25

AW: dll einbinden / Pointer Probleme
 
Und wo steht dort was von einem String/PChar?
Sieht eher nach einem HRESULT/Cardinal aus.
Aber irgendwo wird ja COM_RETURN_OK ja deklariert sein.

Und Integer = SmallInt.

Wie sieht denn die genaue Fehlermeldung aus?
Strg+C im Fehlerdialog drücken und dann Strg+V im Beitrageditor.

Zitat:

Zitat von Pow3rus3r (Beitrag 1162286)
Als Result ist folgendes deiniert:
Code:
Returns:
COM_RETURN_OK Function executed successfully.
COM_RETURN_Failed The function failed to create a new handle.

Falsch, das ist die Beschreibung der möglichen Rückgabewerte.
Es wurde aber absichtlich nach der vollständigen Deklaration gefragt.

shmia 17. Apr 2012 18:28

AW: dll einbinden / Pointer Probleme
 
Zitat:

Zitat von Pow3rus3r (Beitrag 1162269)
ich möchte eine dll, die mit c++ geschrieben wurde in meinem Delphi Programm nutzen.

Lohnt sich das überhaupt? Bzw. was kann die DLL?
Ist das evtl. nur ein Wrapper für TCP/IP?
Ich hab schon erlebt, dass manche versuchen eine DLL für die serielle Schnittstelle anzusteuern, obwohl man mit einer Delphi Komponente viel besser dran wäre.


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:29 Uhr.
Seite 1 von 3  1 23      

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