Einzelnen Beitrag anzeigen

Endgegner

Registriert seit: 13. Mär 2009
5 Beiträge
 
#1

Fehler beim Laden einer C++-DLL in Delphi

  Alt 13. Mär 2009, 09:53
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:
The value of ESP was not properly saved across a function call. This is usally a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
Ich habe natürlich ausgiebig recherchiert und es ist meist auf Unregelmäßigkeiten beim Funktionsaufruf zurückzuführen. Doch leider habe ich keine Ahnung, was ich falsch gemacht habe. Das Problem tritt, wie bereits gesagt, erst nach einiger Zeit auf.

So in etwa würde eine Funktion in der C++-Source-Datei der DLL aussehen:
Delphi-Quellcode:
_declspec(dllexport) Status Funktionsname()
{
   // Quellcode

   return RESULT_OK;
}
In der Delphi-Unit sieht das ganze so aus:
Funktionsname = function(): Integer; cdecl; Und natürlich noch das Laden der Funktion aus der DLL:
Delphi-Quellcode:
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 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?!?

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.
  Mit Zitat antworten Zitat