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.