Aufruf von Funktionen aus einer C ++ DLL in Delphi

8

Ich habe ein neues C ++ - DLL-Projekt in VS2010 erstellt, das eine Funktion enthält

%Vor%

Ich habe dann eine C ++ - Anwendung mit VS2010 erstellt, um diese DLL zu testen. Die in VS2010 erstellte Testanwendung könnte die C ++ DLL aufrufen und das erwartete Ergebnis erhalten.

%Vor%

Als nächstes habe ich versucht, ein neues Projekt in Delphi 7 zu erstellen, um diese C ++ DLL aufzurufen. Ich habe dieses Tutorial verwendet, um mir beim Aufbau des neuen Projekts zu helfen.

%Vor%

Das Ergebnis des Delphi 7 Projekts ist 6155731 Als ich 5 erwartet habe. Ich überprüfte die Binärdarstellung des Ergebnisses und dachte, dass es etwas mit einem Datentyp zu tun haben könnte, aber es sieht für mich zufällig aus. Wenn ich die Anwendung neu kompiliere / wiederhole, bekomme ich jedes Mal dasselbe Ergebnis.

Ich weiß nicht viel über Delphi, das ist das erste Mal, dass ich mich damit beschäftige und ich finde es verwirrend.

Irgendwelche Vorschläge, was Sie als nächstes prüfen sollten?

    
Steven smethurst 01.05.2012, 23:58
quelle

2 Antworten

16

Sie müssen die Aufrufkonvention angeben, in diesem Fall cdecl :

%Vor%

Ihr Code verwendet die standardmäßige Delphi-Aufrufkonvention, die register ist, und übergibt Parameter über Register. Die Aufrufkonvention cdecl übergibt Parameter auf dem Stack und daher erklärt diese fehlende Übereinstimmung, warum die Kommunikation zwischen den beiden Modulen fehlschlägt.

Einige weitere Kommentare:

Der Fehlermodus für LoadLibrary besteht darin, NULL zurückzugeben, also 0 . Überprüfen Sie, dass der Rückgabewert >=32 ist.

Es ist einfacher, implizite Verknüpfungen zu verwenden, um diese Funktion zu importieren. Ersetzen Sie alle LoadLibrary und GetProcAddress Code durch diese einfache Deklaration:

%Vor%

Der Systemlader löst diesen Import beim Start der ausführbaren Datei auf, sodass Sie sich keine Gedanken über die Details der Verknüpfung machen müssen.

    
David Heffernan 02.05.2012, 00:01
quelle
0

In RAD Studio Berlin wird die Cdecl-Funktion, die extern "C" ist, mit einem Unterstrich, dem traditionellen C-Stil "C", vorangestellt, wobei der CLANG-Compiler für den C ++ - Teil verwendet wird. Der obige Code funktioniert in diesem Fall nicht, aber verwenden Sie das Namensattribut der externen Deklaration, um das Problem zu beheben:

Funktion DoMath (X, Y: Ganzzahl): Ganzzahl; cdecl; Externer 'exampleDLL.dll' Name '_DoMath';

Habe es nicht mit anderen Compilern versucht, daher könnte es ein generelles Problem mit cdecl sein. Die Windows-API verwendet nicht cdecl, verwendet aber dieselbe Aufrufkonvention wie Delphi, z. B. die Winapi.Windows-Deklarationen von DLL-Funktionen haben keinen Unterstrich.

Gleiches Wahr, wenn GetProcAddress verwendet wird, ist der korrekte Aufruf GetProcAddress (hDLL, '_DoMath'); sonst wird nil zurückgegeben.

Ich hoffe, dies hilft jedem, der sich darum bemüht, Delphi mit C ++ zu sprechen.

    
Steve Swallow 30.11.2016 10:56
quelle

Tags und Links