Problem mit GetProcAddress
-
Hi ich wollte jetzt aus meiner DLL eine Funktion laden:
if( (hDll = LoadLibrary(TEXT("dict.leo.dll"))) != NULL) { OnInfo.GetTmpList = (fpGetTmpList) GetProcAddress(hDll, "GetTmpList"); if(OnInfo.GetTmpList == NULL) ErrorPrintSave(GetLastError(), hwnd, 2, TRUE); else { LoadStringA(hDll, IDS_HOST, OnInfo.szHost, MAX_HOST_LEN - 1); MessageBox(hwnd, OnInfo.szHost, TEXT("test:"), MB_OK); } } else MessageBox(hwnd, TEXT("Could not load DLL"), TEXT("Error:"), MB_OK);Leider kommt jetzt immer der Fehler:
The specified procedure could not be found
Hier noch Header von dict.leo.dll:
#ifndef __DICT_LEO__ #define __DICT_LEO__ #include "typesDefs.h" #ifdef __cplusplus #define EXPORT extern "C" __declspec (dllexport) #else #define EXPORT __declspec (dllexport) #endif [Restliche Funktionen aus Platzgründen weggelassen] EXPORT TMPLIST* CALLBACK GetTmpList(TCHAR *szFile, int *iError); #endifWarum kommt jetzt dieser Fehler?
MFG PinguGroup
-
Weil die Funktion nicht mit dem Namen GetTmpList exportiert wird wenn du die __stdcall (CALLBACK) Aufrufkonvention benutzt. Google mal nach Def-Datei, damit kann man die Namen dann richtig exportieren. Außerdem solltest du dir mal Dependency Walker anschauen, der zeigt die Funktionsnamen einer DLL an.
-
Danke für die schnelle Antwort.
Hab mir jetzt mal: Dependency Walker herunter geladen und da stand das meine Funktioen: "GetTmpList@8" heisst.
Ok jetzt hab ich das mal als Name eingesetzt und es funktionert einwandfrei.
Theoretisch gesagt könnte ich das ja jetzt so lassen und muss nichts mehr mit den def file rum tun oder?BTW: das "@8" bedeutet doch das die Parameterliste 8Byte umfasst oder?
MFG PinguGroup
-
Es bedeuteted einfach, dass der Namen der exportierten Funktion mangled ist (dekoriert).
Und das wiederum heisst, dass es sicher nicht extern "C" exportiert ist.Benutze für den export von Funktionen im C- Style format entweder __declspec(dllexport) mit extern "C" ODER ein *def File.
Simon
-
Simon es liegt an der Aufrufkonvention!
extern "C" __declspec(dllexport) int Addiere1(int a, int b) { return a + b; } extern "C" __declspec(dllexport) int __stdcall Addiere2(int a, int b) { return a + b; }Addiere1 wird nicht dekoriert, Addiere2 wird dekoriert.
-
ok, danke.