c DLL benutzen
-
Hallo Forum,
ich möchte eine Funktion aus einer c-dll in meinem Programm dynmisch benutzen.
Die betreffende Funktion ist so definiert:__declspec(dllexport) int _cdecl multi2(int);
Mein Programm sieht so aus:
int (_cdecl* multi2)(int); void loadDLL(char* name) { HINSTANCE hDLL = 0; hDLL = LoadLibrary("C:\\Temp\\dllexporting.dll"); if(hDLL != NULL) { printf("DLL geladen."); multi2 = (BOOL CALLBACK(__cdecl *)(void))GetProcAddress(hDLL, "multi2"); printf("4 * 2= ", multi2(4)); FreeLibrary(hDLL); } else { printf("DLL nicht geladen."); } }
Könntet Ihr mir da weiterhelfen? Wenn ich einen Link zu einem funktionierendem BSP (C DLL Projekt+Test Projekt) bekommen würde wäre mir auf jeden Fall geholfen. Im Inet habe ich ein paar BSP's gefunden. Haben mir aber nicht wirklich weitergeholfen.
Viele Grüße
Peter
-
Und was gibt es aus?
-
Vielleicht nutzt es was, die Funktion im EXE-Modul so zu deklarieren:
__declspec(dllimport) int _cdecl multi2(int);
-
Im Code hatte ich noch einen Fehler...
#include "stdafx.h" #include <shlobj.h> #include <stdio.h> #include <windows.h> HINSTANCE hDLL = 0; int (_cdecl* multi2)(int); //__declspec(dllimport) int _cdecl multi2(int); void loadDLL(char* name) { hDLL = LoadLibrary("C:\\Temp\\dllexporting.dll"); if(hDLL != NULL) { printf("DLL geladen."); multi2 = (int CALLBACK(__cdecl *)(void))GetProcAddress(hDLL, "multi2"); printf("4 * 2= ", multi2(4)); FreeLibrary(hDLL); } else { printf("DLL nicht geladen."); } } int main(int argc, char* argv[]) { loadDLL(NULL); return 0; }
Die Fehler sehen so aus:
dlltest2.cpp C:\Dokumente und Einstellungen\ernst.jaeger\Desktop\dlltest2\dlltest2.cpp(21) : error C2059: Syntaxfehler : '__cdecl' C:\Dokumente und Einstellungen\ernst.jaeger\Desktop\dlltest2\dlltest2.cpp(21) : error C2143: Syntaxfehler : Fehlendes ')' vor '(' C:\Dokumente und Einstellungen\ernst.jaeger\Desktop\dlltest2\dlltest2.cpp(21) : error C2066: Typumwandlung in Funktionstyp nicht erlaubt C:\Dokumente und Einstellungen\ernst.jaeger\Desktop\dlltest2\dlltest2.cpp(21) : error C2059: Syntaxfehler : ')' C:\Dokumente und Einstellungen\ernst.jaeger\Desktop\dlltest2\dlltest2.cpp(21) : error C2440: 'type cast' : 'void' kann nicht in 'int (__stdcall *)(void)' konvertiert werden Ausdruck vom Typ void kann nicht in andere Typen konvertiert werden Fehler beim Ausführen von cl.exe. dlltest2.exe - 5 Fehler, 0 Warnung(en)
-
Ach ja, der Code von der dll sieht so aus:
//#ifndef _CONTR_H_INCLUDED__ //#define _CONTR_H_INCLUDED__ #if defined(__cplusplus) extern "C" { #endif #define EXPORT __declspec(dllexport) #define CALL _cdecl EXPORT int CALL multi2(int); #if defined(__cplusplus) } #endif //#endif #include <windows.h> HINSTANCE g_hInstance; int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: g_hInstance = hInstance; break; case DLL_PROCESS_DETACH: break; } return TRUE; } EXPORT int CALL multi2(int factor) { return factor*2; }
-
typedef int (_cdecl* MULTI2)(int); ... MULTI2 multi2 = (MULTI2)GetProcAddress(hDLL, "multi2"); ... printf("4 * 2= ", multi2(4));
-
Hallo CMatt,
vielen Dank für die Hilfe, ich probiers gleich aus.
Viele Grüße
Peter