Dynamisches Laden einer dll mit Parameter (CString)
-
Hi,
ich habe mir schon einiges zusammengesucht und auch getestet,
ich komme allerdings nicht zum Ziel.Ich möchte eine DLL dynamisch laden. Das klappt auch, solange ich
nicht vor der Herausforderung stehe einen CString oder sonstwas
mit übergeben zu müssen.FARPROC pFunc; CString strTemp = "abc"; HMODULE hDll = LoadLibrary("testlauf.dll"); if(!hDll) return; pFunc = GetProcAddress(hDll, "MYFUNC"); // Funktionsname angeben if(pFunc) (&pFunc)(strTemp); //Parameter mit übergeben //<----Ausdruck ergibt keine Funktion, die 1 Argumente übernimmt FreeLibrary(hDll);Ich muss wohl auch irgendwo sagen, dass meine Funktion überhaupt einen Parameter
erwartet. Ich habe keinen Schimmer wie das funktioniert
-
Der Typ für den Funktionspointer muss entsprechend definiert werden:
//hoffe das stimmt so, kann grad nicht nachsehen typedef int (_cdecl *MYFUNC)(CString sTest); MYFUNC pFunc;
-
Du musst den FARPROC Zeiger auf einen entsprechende Funktionszeiger mit der Signatur casten.
Hier z.B. ein Code Snippet dass, etwas ähnliches mit einem Zeigr auf eine Datenstruktur macht:
typedef HRESULT (CALLBACK* DLLGETVERSIONPROC)(DLLVERSIONINFO *); bool MyDllGetVersion(LPCTSTR szModulename, DLLVERSIONINFO& dvi) { HINSTANCE hinst = ::LoadLibrary(szModulename); if (!hinst) return false; // Must use GetProcAddress because the DLL might not implement // DllGetVersion. Depending upon the DLL, the lack of implementation of the // function may be a version marker in itself. DLLGETVERSIONPROC pDllGetVersion = (DLLGETVERSIONPROC)::GetProcAddress(hinst, "DllGetVersion"); if (!pDllGetVersion) { // Entladen ::FreeLibrary(hinst); return false; } // Clear result struct memset(&dvi, 0, sizeof(dvi)); // clear dvi.cbSize = sizeof(dvi); // set size for Windows bool bReturn = SUCCEEDED((*pDllGetVersion)(&dvi)); // Free again ::FreeLibrary(hinst); return bReturn; }Warnung: Das Austauschen von CString's zwischen EXE und DLL funktioniertnur Zuverlassig, wenn 1. MFC nicht statisch gelinkt wird und 2. auch die gleiche CRT verwendet wird und 3. auch der gleiche Compiler (SP) verwendet wird.
-
EDIT: Doppelpost gelöscht....
-
Danke euch beiden, das hat mir sehr geholfen.
Mir war nicht klar, dass man so den typedef benutzen muss.
Damit hat es wunderbar kompiliert und jetzt ist es auch logischer
für mich nachzuvollziehen