0x00 函數原型
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 將(由 LoadLibrary、AfxLoadLibrary
或 GetModuleHandle 返回的)DLL 模塊句柄和要調用的函數名或函數的導出序號用作參數。
由於是通過指針調用 DLL 函數並且沒有編譯時類型檢查,需確保函數的參數是正確的,以便不會超出在堆棧上分配的內存和不會導致訪問沖突。 幫助提供類型安全的一種方法是查看導出函數的函數原型,並創建函數指針的匹配 typedef。