2011-08-12 46 views
2

我必須使用DLL中的簡單函數;我能夠加載庫,但GetProcAddress返回NULL。我認爲我理解了名字混亂,但也許我做錯了什麼。謝謝(代碼如下,儘快我會添加所需的其他信息):GetProcAddress返回NULL

mydll.h從main.cpp中

#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); 
} 

代碼

... 
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; 
... 

回答

5

是的,MessageBox()調用成功,沒有錯誤。在它之前移動GetLastError()調用。

錯誤是可預測的,它找不到「mouseProc」。這個名字將會在DLL中被破壞,很可能是「_mouseProc @ 12」。確保使用DLL上的dumpbin.exe/exports。 Fwiw:你可以通過不動態加載DLL而只是鏈接它的導入庫來使這個代碼更加痛苦。 DLL將被注入到其他進程的事實並不意味着你必須將它注入到你的程序中。所有你需要的是模塊句柄,所以你可以調用SetWindowsHookEx()。從DllMain()入口點或使用GetModuleHandle()獲取它。

+1

是的,它是:)過程名稱正是「_mouseProc @ 12」。我認爲使用'extern「C」'可以避免函數名稱混亂。有沒有辦法做到這一點,或者我必須使用「_mouseProc @ 12」? – gc5

+2

您可以添加鏈接器的定義(.DEF)文件以將名稱更改爲任何您喜歡的名稱。 – hamstergene

+0

@Francesco - 該名稱是C錯位的名稱,而不是C++錯位的名稱。 C++ mangled名稱必須應付重載,所以它們(以一種神祕的方式)描述所有參數的類型。領先的下劃線幾乎總是被添加到目標文件中的C函數名稱 - 我不知道爲什麼。我不知道'@ 12'代表什麼 - 也許別人會這樣做?無論如何,目前完全未修飾的名字在對象或目標文件中非常罕見 - 這只是我們必須習慣的一種煩惱。 – Steve314