![]() |
Fehler beim Laden einer C++-DLL in Delphi
Hallo zusammen,
ich hoffe sehr, dass ihr mir helfen könnt. Ich sitze gerade auf der Arbeit und suche verzweifelt die Ursache eines Fehlers. Das Hauptprogramm ist in Delphi geschrieben und ich schrieb vor einiger Zeit eine Software-API (als DLL) für ein Hardwäregerät in C++. Ich habe schon vor einiger Zeit die Software-API für die Hardware in das Delphi-Programm eingebunden, doch mir ist bei einem Langzeittest ein Fehler begegnet. Wenn die Kommunikation zu dem Gerät beendet wird und viele Zeit später (etwa eine Stunde oder mehr) die Verbindung wieder hergestellt wird, kommt folgende Fehlermeldung: Zitat:
So in etwa würde eine Funktion in der C++-Source-Datei der DLL aussehen:
Delphi-Quellcode:
In der Delphi-Unit sieht das ganze so aus:
_declspec(dllexport) Status Funktionsname()
{ // Quellcode return RESULT_OK; }
Delphi-Quellcode:
Und natürlich noch das Laden der Funktion aus der DLL:
Funktionsname = function(): Integer; cdecl;
Delphi-Quellcode:
Ich muss doch, nach meinem Verständnis, cdecl benutzen, weil es sich um C++-Funktionen in der DLL handelt. Das Laden der Funktion geschieht auch offensichtlich korrekt, da sonst der Fehler schon sofort auftreten würde. Wo aber liegt dann meine Verletzung mit den Zeigern, von der die Fehlermeldung spricht?!?
function LoadFunctions(var API: DeviceAPI): Boolean;
begin; Result := False; with API do begin if (ApiDll <> 0) then FreeLibrary(ApiDll); ApiDll := LoadLibrary(RIGHT_PATH); if (ApiDll <> 0) then begin FN := GetProcAddress(ApiDll, 'Funktionsname'); ... Ich wäre für eure Hilfe sehr dankbar. P.S: Die DLL wird dynamisch zur Laufzeit geladen, da das Hardware-Device nur auf Anfrage benutzt wird. |
Re: Fehler beim Laden einer C++-DLL in Delphi
Hallo Endgegner,
wie ist der Typ Status definiert ? Blausweiss |
Re: Fehler beim Laden einer C++-DLL in Delphi
Delphi-Quellcode:
Dies sollte mit dem Integer-Datentyp in Delphi verträglich sein. Die Rückgabewerte der Funktionen sind alles Zahlenkonstanten. Also das "RESULT_OK", das in der Beispielsfunktion zurückgegeben wird, wurde in der C++-Source-Datei definiert als
typedef short int Status;
Delphi-Quellcode:
Ein Konflikt mit Datentypen habe ich für mich ausgeschlossen, nachdem ich alle vorkommenden Variablen in der Delphi-Unit mit denen in der C+-Datei verglichen hatte.
#define RESULT_OK 0
|
Re: Fehler beim Laden einer C++-DLL in Delphi
Zitat:
Interessant für die weitere Analyse wäre, wenn du den Fehler im Debugger reproduzieren könntest und dann die Signaturen genau der Funktion, bei deren Aufruf es auftritt in C++ und Delphi näher betrachtest (-> Call-Stack). |
Re: Fehler beim Laden einer C++-DLL in Delphi
Zitat:
btw: cdecl hat nichts mit mit C++ zu tun, probier mal bei dir stdcall Edit: Hier siehts du auch dein Problem genau beschrieben ![]() ...entweder du kümmerst dich selbst drum den Stack wieder in den richtigen Zustand zu kriegen oder du benutzt stdcall. |
Re: Fehler beim Laden einer C++-DLL in Delphi
Ich werde gleich mal wieder das Programm starten und nach Reproduktion des Fehlers (dauert leider min. eine Stunde, siehe Ausgangsthread) werde ich mir, wenn möglich, den Aufrufstack anschauen. Danke für den Tipp, daran hatte ich noch gar nicht gedacht.
Die Seite zum Thema Aufrufkonventation hate ich bereits durchgelesen und auch wenn ich
Delphi-Quellcode:
zu
Funktionsname = function(): Integer; cdecl;
Delphi-Quellcode:
ändere, macht es keinen Unterschied! Ich habe bevor ich hier den Ausgangspost schrieb, bereits länger nach der Fehlermeldung und den verschiedenen Aufrufarten recherchiert.
Funktionsname = function(): Integer; stdcall;
|
Re: Fehler beim Laden einer C++-DLL in Delphi
Wenn die Funktion nicht all zu lang ist, könntest du mal den ASM-Code aus dem CPU-Fenster hier posten.
|
Re: Fehler beim Laden einer C++-DLL in Delphi
Zitat:
cdecl ist die Standard-Aufrufkonvention in C++ (es sei natürlich denn, du änderst das über einen Compilerswitch). |
Re: Fehler beim Laden einer C++-DLL in Delphi
Zitat:
|
Re: Fehler beim Laden einer C++-DLL in Delphi
Nach einem weiteren Testlauf, habe ich geschaut, an welcher Stelle es genau knallt. Der Fehler tritt, wie im Ausgangspost beschrieben, auf, wenn man nach längerer Pause die Kommunikation zu dem Hardwaregerät wieder startet. Die Fehlermeldung kommt genau dann, wenn im Hauptprogramm (Delphi) die Kommunikation wieder aufgenommen wird und die dazugehörigen Funktionen aus der Software-API (die DLL in C++) geladen werden sollen.
Ist es irgendwie möglich, dass das Delphi-Programm die Verbindung zur Software-API, also besser gesagt zur DLL, verlieren könnte und damit die Zeiger ins Nirgendwo zeigen? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:29 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