Delphi DLL verwenden ...
-
Hallo,
ich habe nun schon einige DLLs in VC++ verwendet und diese mit Loadlibrary
und GetProcAdress eingebunden.
Nun hat mir ein Kumpel eine Delphi DLL gegeben, die ganz einfach eine
Variable um 1 erhöht.
Ebenso befindet sich in der DLL eine funktion, die ein Messagefenster mit
"Hallo Welt" darstellt.
Gesagt getan, Laden der DLL geht, Getprocadress geht und das Aufrufen des
Fensters geht.
NUR: eine Übergabe mit INT geht einfach nicht !!Hier meine Definitionen:
typedef char* (fensterzeigenfunktion)();
typedef char (*zahladdierenfunktion)(int zahl);//wobei ich mir mit "zahl" nicht sicher bin ?? die Funktionen geben NUR
//eine "OK" als Char zurück, also keine EgebnisseHMODULE mod = LoadLibrary("meinedummeDLL.dll");
fensterzeigenfunktion ZeigFenster = (fensterzeigenfunktion)(GetProcAddress(mod,"ZeigFenster"));
zahladdierenfunktion AddiereZahl = (zahladdierenfunktion)(GetProcAddress(mod,"AddiereZahl"));
char* string1=ZeigFenster();
char* string2=AddiereZahl(1);irgendeine Vermutung, warum eine 0815 DELPHI DLL nicht geht ?
Eine C++ DLL mit gleichem Inhalt tuts dagegen perfect !!
Irgendwie vermute ich ein Problem mit der Übergabe des INTEGER ??Es kommt beim Aufruf der zweiten Funktion zu folgendem:
Unbehandelte Ausnahme bei 0x013d258f in DLL-Loader.exe: 0xC0000005: Zugriffsverletzung-Leseposition 0x00000001.
-
Wie sieht deine eure Funktion in C++ aus?
-
Liegt bestimmt an dem char* Rückgabewert. Mach mal void zum Test...
-
Delphi verwendet __stdcall.
-
zum aussehen:
function AddierZahl(var Zahl: Integer): PChar; stdcall;
begin
Zahl:=Zahl+1;
Result:=PChar("OK");
end;Void habe ich schon versucht !! Wollte eigentlich NUR VOID, habe allerdings
festgestellt das z.B. der Fensteraufruf dann auch nicht mehr will.
(Also Void in der Delphi DLL und dem C++ Programm!!)zu Ringding:
Ja, das weiss ich, desshalb habe ich den Aufruf auch schon mit WINAPI
versucht, das eigentlich auf stdcall basieren sollte ??typedef char* (WINAPI *zahladdierenfunktion)(int zahl);
oder wie meinst du genau ??
-
Ja, genau so.
-
Das is 'n bisschen fies, wenn man sich in Delphi nicht sehr gut auskennt:
Zahl wird als var-Parameter übergeben, d.h. in der Funktion soll der übergebene Wert geändert werden und der geänderte Wert soll zurückgegeben werden können -> Delphi erwartet einen Pointer! Deshalb auch die Zugriffsverletzung an Adresse 1, wenn Du "1" übergibst.#include <iostream> #include <windows.h> using namespace std; typedef char* (*zahladdierenfunktion)(int *zahl); int main(int argc, char *argv[]) { HMODULE mod = LoadLibrary("Project1.dll"); if (mod != NULL) { zahladdierenfunktion AddiereZahl = (zahladdierenfunktion)(GetProcAddress(mod,"AddZahl")); int zahl = 1; char* string2=AddiereZahl(&zahl); cout << zahl; FreeLibrary( mod ); } }saberider
-
Klasse ...
Ich hab das jetzt mal geändert und es geht mit einem kleinem Schritt
weiter. Es wird jetzt die Funktion ausgeführt, aber nach dem zurückkehren
gibt es jetzt denselbigen Fehler.
Was könnte da jetzt noch sein ? irgendein spezieller Pointer für die char* ?Achja, beim
zahladdierenfunktion AddiereZahl = (zahladdierenfunktion)(GetProcAddress(mod,"AddZahl"));
vermute ich, das das erste zahladdierenfunktion weg kommt ?Fehler:
Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
-
Hab jetzt in der Delphi .dpr den stdcall gegen cdecl ausgetauscht und
jetzt gehts. Hab alsu das ganze mit C Unterstützung kompiliert.Weiss jemand warum ? gehts auch anders ?
-
Man muss auch __stdcall in den Funktionspointer machen. Etwa so:
typedef char* (__stdcall *fensterzeigenfunktion)();
-
Also erstmal Dank für die zahlreichen Mails.
Die Lösung sieht jetzt so aus:
- In der Delphi DLL wurde das VAR verbannt
- die Definition: typedef char* (__stdcall zahladdierenfunktion)(int zahl);
- Aufruf: char string=AddiereZahl(zahl);durch das __stdcall konnte ich das cdecl in der Delphi DLL wieder gegen
das stdcall austauschen.Funzt bestens !!