DLL Problem
-
Hi,
ich habe einen Funktionspointer einer Funktion einer DLL in einer anderen DLL. Wenn ich jetzt den Pointer ausführe, kommt der 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.Leider kann ich mir den Fehler nicht erklären. Die Deffinition des Funktionpointers ist
int (WINAPI* pImportFunc)(char*);(WINAPI ist __stdcall) und die Funktion wird in meiner WndProc (auch WINAPI, statische Memberfunktion einer Klasse) ausgeführt. Eigentlich sind ja dann die calling convention gleich, oder?
Danke,
Chrissi
-
Aber ist die Funktion selber auch __stdcall?
-
Ja, der Funktionspointer ist WINAPI sowie die DllMain und die WndProc funktion. (In der WndProc wird der Pointer aufgerufen).
Vielleicht liegt hier auch das Problem: Ich habe ja den DLL-Funktionspointer in einer DLL aufgerufen. Wobei an anderer Stelle daselbe funktioniert...
-
Dass der Funktionspointer __stdcall ist, sagtest du schon, das sieht man ja auch an deinem Code. Aber ich will wissen, ob die Funktion selber (also die in der anderen DLL) auch mit __stdcall compiliert wurde.
-
Ich weiß zwar nciht so genau, was du meinst, aber die Funktion, auf die der Funktionspointer zeigt ist wiefolgt deffiniert:
extern "C" { __declspec(dllexport) int TEST_FUNC(char* pFileName) { // ... } }Danke,
Chrissi
PS: Und die WinMain, die die DLL (mit dem Funktionspointer auf die andere DLL aufruft) ist auch WINAPI
-
extern "C" { __declspec(dllexport) int WINAPI TEST_FUNC(char* pFileName) { // ... } }
-
Ist die Funktion in der DLL, die du aufrufen willst, nicht von dir?
-
*PUSH*
->Muss noch mal überlegen
-
So,
habe eine kleine Pause gemacht (ich war in einem schönen Konzert des Dresdner Kreuzkores...) und gedacht habe ich auch (mal)...
@Hepi: Deine Lösung könnte funktionieren, wobei meine Rechner die Funktion mit WINAPI neben dem int nicht per GetProcAdress findet. Vielleicht gibt es da ja aber auch andere Möglichkeiten, eine Funktion in einer DLL-Datei zu finden...
@RingDing: Die Funktion ist natürlich von mir, wobei zur Komplimierung durch den Compiler nur der Funktionskopf (__declspec(dllexport) int TEST_FUNC(char* pFileName) )bekannt ist. Der Funktionsrumpf ist unbekannt.
Ich hoffe, jemand kann mir helfen,
danke,
Chrissi
-
Sofern du keine .DEF-Datei erstellst (siehe MSDN), wird extern "C" int __stdcall TEST_FUNC(char*); mit dem Namen "_TEST_FUNC@4" exportiert (@4 = Anzahl Bytes in der Parameterliste). Das solltest du mit GetProcAddress finden können.
-
Wenn der Funktionskopf so ausschaut, wie du es angibst, dann ist es kein Wunder, dass es nicht geht.
This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
Das sagt eigentlich alles. Du hast ohne WINAPI compiliert, versucht sie aber mit WINAPI aufzurufen.