einfach eine funktion einer DLL aufrufen
-
*sorry wieder eine warscheinlich sau simple frage *
Ich habe nur so halb Tutorials dazu gefunden, und mir was zusammengesückelt,
aber es funktioniert irgendwie nichtApplication
//mainapp.cpp #include <iostream> #include <windows.h> #include <string> typedef std::string (WINAPI PLUGM) ( std::string bef ); typedef PLUGM *LPPLUG; using namespace std; int main () { HINSTANCE hinstDLL; LPPLUG myPlug; if (NULL == (hinstDLL = LoadLibrary ("sample.dll"))) { cout<< "Die DLL konnte nicht geladen werden!"<< endl; return 0; } myPlug = (LPPLUG) GetProcAddress (hinstDLL, "PLUGM"); if (myPlug == NULL) { cout << "Die Funktion existiert nicht in der DLL!"<< endl; return 0; } std::cout << myPlug ("lol"); FreeLibrary (hinstDLL); return 0; }Dll
//dllmain.cpp #include <windows.h> #ifdef BUILD_DLL #define DLL_EXPORT __declspec(dllexport) #else #define DLL_EXPORT #endif #include <string> // a sample exported function std::string DLL_EXPORT PLUGM(const LPCSTR sometext) { return "DLL Message"; } BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: // attach to process // return FALSE to fail DLL load break; case DLL_PROCESS_DETACH: // detach from process break; case DLL_THREAD_ATTACH: // attach to thread break; case DLL_THREAD_DETACH: // detach from thread break; } return TRUE; // succesful }kann mir jemand helfen?
was ist bloß falsch?
-
Du mußt schon selber dafür sorgen, daß du den richtigen Funktionstyp verwendest. Deine DLL-Funktion erwartet einen "const LPCSTR" Parameter, über den Funktionspointer übergibst du ihr aber einen "std::string" - da ist es unausweichlich, daß du dein Programm in Stücke schießt.
(und da der Compiler kann dich nichtmal davor warnen, daß du etwas falsch machst)
-
hups....
gut, berichtigt, geht aber trotzdem nicht
DLL Code
#include <windows.h> #ifdef BUILD_DLL #define DLL_EXPORT __declspec(dllexport) #else #define DLL_EXPORT #endif #include <string> // a sample exported function std::string DLL_EXPORT PLUGM(std::string bef) { return "DLL Message"; } BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: // attach to process // return FALSE to fail DLL load break; case DLL_PROCESS_DETACH: // detach from process break; case DLL_THREAD_ATTACH: // attach to thread break; case DLL_THREAD_DETACH: // detach from thread break; } return TRUE; // succesful }
-
Hast du die Funktion auch als Symbol definiert?
In dem Projekt mus irgendwo Export.def sein, da musst du den Funktionsnamen noch hinzufügen
-
Kriegst du überhaupt die Addresse der Funktion so wie du GetProcAddress aufrufst? Vermutlich wird sie unter einem anderen Namen exportiert (Name Mangling)...schau sonst mal mit Dependency Walker nach. Ausserdem könnte es auch ein Problem sein wenn die Dll und Exe unterschiedliche Versionen der C Laufzeitbibliothek benutzen...
-
Was geht denn nicht?
Und es könnte nicht nur sein, dass es Probleme gibt, wenn die EXE und die DLL unterschiedliche CRTs verwenden, sondern dies gibt 100%ig Probleme.
Also: EXE und DLL müssen die gleiche CRT-DLL-Version verwenden!!!
-
also das problem ist das das programm ausgibt das die funktion nicht gefunden wurde....
ich raf net was ich falsch gemacht habe
-
Ach so... du verwendest "GetProcAddress"... hab ich übersehen... der Namen ist einfach falsch.
Schau Dir mal den Namen der Methode in der DLL z.B. mit depends an...
http://www.dependencywalker.com/Und wie gesagt: Du musst wirklich die gleicheDLL-Version der CRT in der EXE und der DLL verwenden, wenn Du STL/MFC/CRT Klassen in der Funktions-Signatur verwendest!
-
#include <iostream> #include <windows.h> #include <string> typedef std::string (__stdcall*_plugm)(std::string); _plugm PLUGM = NULL; int main(void) { // Library laden ::HINSTANCE__* hDll = ::LoadLibrary ("sample.dll"); if(hDll == NULL) { std::cout << "Die gewünschte Datei konnte nicht geladen/gefunden werden!" << std::endl; return -1; } PLUGM = reinterpret_cast<_plugm>(::GetProcAddress(hDll,"PLUGM")); if(PLUGM == NULL) { ::FreeLibrary (dll); std::cout << "Es ist ein Fehler beim Laden aufgetreten!" << std::endl; return -1; } std::cout << ::PLUGM("lol") << std::endl; ::FreeLibrary(hDll); return 0; }