Einzelnen Beitrag anzeigen

TSchnuckenbock

Registriert seit: 20. Jul 2017
Ort: Lüneburger Heide
71 Beiträge
 
Delphi XE5 Professional
 
#1

Zwei DLLs statisch laden

  Alt 25. Feb 2022, 17:48
Der Hersteller eines externen Gerätes hat seine API angepasst. In dieser API ist die Kommunikation zum Gerät via Netzwerk gekapselt.
Der Hersteller hat ein SDK mitgeliefert, in dem ein Demo-Projekt in C++ (Visual Studio) enthalten ist mit den entsprechenden Header-Dateien und den *.lib-Dateien. (die Visual-Studio-Demo krieg ich aktuell aber nicht erzeugt....früher bei einer älteren API-Version hatte ich das aber mal am Laufen)
Zusätzlich gibt es die DLLs, damit man die Funktionen auch anderweitig nutzen kann.
Auch ein Simulator als „exe“ ist vorhanden um ohne externes Gerät entwickeln zu können.

In früheren API-Versionen war es eine DLL, die benötigt wurde. In der neuen API sind die Funktionen nun in zwei DLLs aufgesplittet (und um weitere Funktionen ergänzt worden).

Ich beschränke mich jetzt auf drei Funktionen: Connect, Disconnect und DoSomehting.
Die haben sich im Laufe der API-Versionen nicht geändert (Name und Parameter immer gleich).

Früher waren alle Funktionen in der einen „Lib_Old.dll“.

Nun sind Connect und Disconnect in „Lib_A.dll“ und die DoSomething in der „Lib_B.dll“.

Das statische Laden der DLL in früheren APIs hat bisher geklappt. Nur jetzt mit zwei DLLs klappt es nicht.

Der Code sieht prinzipiell so aus:

Delphi-Quellcode:
unit uUnit_Bsdp_DelphiPraxis;

interface

const

  LIB_A = 'Lib_A.dll';
  LIB_B = 'Lib_B.dll';

  LIB_OLD = 'Lib_Old.dll';

   // Rückgabewerte:
   // 0: OK
   // > 0: Fehlercode
  function api_Connect(IPAddress: PAnsiChar; var ClientHandle: Integer): Integer; cdecl; external LIB_A;
  function api_Disconnect(ClientHandle: Integer): Integer; cdecl; external LIB_A;

  function api_DoSomething(ClientHandle: Integer): Integer; cdecl; external LIB_B;


implementation

end.
Beim Connect wird ein ClientHandle generiert, was man dann zurückbekommt, um damit dann zukünftig alle Funktionen aufzurufen. Das ist immer „1“.

Problem ist, daß Connect und Disconnect aus der „Lib_A.dll“ funktionieren, aber das DoSometing aus der „Lin_B.dll“ nicht.
Nehme ich im obigen Code jeweils hinter dem external „Lib_Old.dll“, lade also alle drei Funktionen aus der DLL einer älteren API, dann macht der Simulator brav alles, was er soll.

Jetzt hätte ich ja gedacht, daß ich mir nur die DoSomething aus der älteren „Lib_Old.dll“ hole und Connect und Disconnect aus der „Lib_A.dll“ und alles müßte funktionieren.
Tut‘s aber nicht. Connect und Disconnect funktionieren, aber die DoSomething wieder nicht.
Als Rückgabewert bekomme ich ürbigens den Fehlercode „Invalid ClientHandle“.

Ausprobiert hatte ich auch StdCall statt cdecl bei der DoSomething......hilft aber auch nichts.

Muß man irgendwas beachten, beim Laden mehrerer DLLs?
Mit „Index“ hatte ich auch schon fruchtlos rumprobiert.

Hat irgendwer eine zündende Idee, wo ich jetzt noch ansetzen könnte?

Ein Projekt mit dynamischen Laden hatte ich auch probiert, aber mit dem selben Ergebnis.
  Mit Zitat antworten Zitat