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。
