1. 程式人生 > >LoadLibraryA與GetProcAddress介紹

LoadLibraryA與GetProcAddress介紹

0x00 函式原型

HMODULE LoadLibraryA(     LPCTSTR lpLibFileName//模組的的的名字 ) FARPROC GetProcAddress( HMODULE hModule, // DLL模組控制代碼 LPCSTR lpProcName // 函式名 );

0x01 作用

程序呼叫 LoadLibrary(或 AfxLoadLibrary)以顯式連結到 DLL。 如果函式執行成功,它會將指定的 DLL 對映到呼叫程序的地址空間中並返回該 DLL 的控制代碼。此控制代碼可以與其他函式(如 GetProcAddress

FreeLibrary)一起在顯式連結中使用。

LoadLibrary 將嘗試使用用於隱式連結的相同搜尋序列來查詢 DLL。 如果系統無法找到所需的 DLL 或者入口點函式返回 FALSE,則 LoadLibrary 將返回 NULL。 如果對 LoadLibrary 的呼叫所指定的 DLL 模組已對映到呼叫程序的地址空間中,則該函式將返回該 DLL 的控制代碼並遞增模組的引用數。

如果 DLL 具有入口點函式,則作業系統將在呼叫 LoadLibrary 的執行緒的上下文中呼叫此函式。 如果由於以前呼叫了 LoadLibrary,但沒有相應地呼叫 FreeLibrary 函式,從而導致已經將 DLL 附加到程序,則不會呼叫此入口點函式。

對於載入擴充套件 DLL 的 MFC 應用程式,建議使用 AfxLoadLibrary,而不使用 LoadLibrary。 在呼叫 LoadLibrary 之前,AfxLoadLibrary 處理執行緒同步。 AfxLoadLibrary 的介面(函式原型)與 LoadLibrary 相同。

顯式連結到 DLL 的程序呼叫 GetProcAddress 來獲取 DLL 匯出函式的地址。 使用返回的函式指標呼叫 DLL 函式。 GetProcAddress 將(由 LoadLibraryAfxLoadLibraryGetModuleHandle 返回的)DLL 模組控制代碼和要呼叫的函式名或函式的匯出序號用作引數。

由於是通過指標呼叫 DLL 函式並且沒有編譯時型別檢查,需確保函式的引數是正確的,以便不會超出在堆疊上分配的記憶體和不會導致訪問衝突。 幫助提供型別安全的一種方法是檢視匯出函式的函式原型,並建立函式指標的匹配 typedef。