GetProcAddress devuelve NULL

Tengo que usar una función simple de una DLL; Puedo cargar la biblioteca pero GetProcAddress devuelve NULL. Creo que entendí la mutilación de nombres, pero tal vez estoy haciendo algo mal. Gracias (el código sigue, lo antes posible agregaré otra información requerida):

mydll.h

#ifdef MYDLL_EXPORTS #define MYDLL_API extern "C" __declspec(dllexport) #else #define MYDLL_API extern "C" __declspec(dllimport) #endif MYDLL_API void testFunction(void); MYDLL_API LRESULT CALLBACK mouseProc(int nCode, WPARAM wParam, LPARAM lParam); 

mydll.cpp

 #include "stdafx.h" #include "mydll.h" // This is an example of an exported function. MYDLL_API void testFunction(void) { MessageBox(NULL, (LPCWSTR)L"Test", (LPCWSTR)L"Test", MB_OK); } MYDLL_API LRESULT CALLBACK mouseProc(int nCode, WPARAM wParam, LPARAM lParam) { // processes the message if(nCode >= 0) { if(wParam != NULL && wParam == MK_RBUTTON) { MessageBox(NULL, (LPCWSTR)L"Captured mouse right button", (LPCWSTR)L"Test", MB_OK); } } // calls next hook in chain return CallNextHookEx(NULL, nCode, wParam, lParam); } 

código de main.cpp

 ... case WM_CREATE: { // creates state for window stateClassPointer = new stateClass(); // saves states pointer in a space reserved for user data SetWindowLongPtr(hWnd, GWLP_USERDATA, (LONG_PTR) stateClassPointer); // now it will load DLL and set up hook procedure for mouse events // declares local variables HOOKPROC hkprcMouseProc; HINSTANCE hinstDLL; HHOOK hhookMouseProc; //FARPROC WINAPI test; // loads DLL if((hinstDLL = LoadLibrary(TEXT("C:\\Users\\Francesco\\Dropbox\\poli\\bi\\not\\pds\\sp\\wk5\\lsp5\\Debug\\mydll.dll"))) == NULL) { MessageBox(hWnd, (LPCWSTR)L"Error loading DLL", (LPCWSTR)L"Error", MB_OK | MB_ICONERROR); break; } // saves DLL handle in the state class stateClassPointer->setHInstance(hinstDLL); // sets up hook procedure for mouse events if((hkprcMouseProc = (HOOKPROC)GetProcAddress(hinstDLL, "mouseProc")) == NULL) { MessageBox(hWnd, (LPCWSTR)L"Error setting windows hook: GetProcAddress", (LPCWSTR)L"Error", MB_OK | MB_ICONERROR); break; } if((hhookMouseProc = SetWindowsHookEx(WH_MOUSE, hkprcMouseProc, hinstDLL, 0)) == NULL) { MessageBox(hWnd, (LPCWSTR)L"Error setting windows hook: SetWindowsHookEx", (LPCWSTR)L"Error", MB_OK | MB_ICONERROR); break; } // saves hook handle in the state class stateClassPointer->setHHook(hhookMouseProc); /*test = GetProcAddress(hinstDLL, "testFunction"); test();*/ } break; ... 

Sí, la llamada a MessageBox () se realizó sin errores. Mueve la llamada GetLastError () antes de ella.

El error es de otra manera predecible, no pudo encontrar “mouseProc”. El nombre se modificará en la DLL, probablemente “_mouseProc @ 12”. Use dumpbin.exe / exports en su DLL para estar seguro.

Fwiw: puede hacer que este código sea menos doloroso al no cargar dinámicamente la DLL, sino simplemente vincular su biblioteca de importación. El hecho de que la DLL se inyecte en otros procesos no significa que tenga que inyectarla en el suyo. Todo lo que necesita es el controlador del módulo para que pueda llamar a SetWindowsHookEx (). Obtenga eso desde el punto de entrada DllMain () o utilizando GetModuleHandle ().