动态链接库 仅有.dll文件时候的使用方法
在沒有.h和.lib文件時,需要函數指針和WIN32 API函數?LoadLibrary,?GetProcAddress?和FreeLibrary
只需要.dll文件即可(將.dll文件置入工程目錄中)。
LoadLibrary
進程調用?LoadLibrary以顯式鏈接到 DLL。?如果函數執行成功,它會將指定的 DLL 映射到調用進程的地址空間中并返回該 DLL 的句柄。
此句柄可以與其他函數(如?GetProcAddress?和FreeLibrary)一起在顯式鏈接中使用。
LoadLibrary?將嘗試使用用于隱式鏈接的相同搜索序列來查找 DLL。?如果系統無法找到所需的 DLL 或者入口點函數返回 FALSE,
則?LoadLibrary?將返回 NULL。?如果對?LoadLibrary?的調用所指定的 DLL 模塊已映射到調用進程的地址空間中,
則該函數將返回該 DLL 的句柄并遞增模塊的引用數。
如果 DLL 具有入口點函數,則操作系統將在調用?LoadLibrary?的線程的上下文中調用此函數。?
如果由于以前調用了?LoadLibrary,但沒有相應地調用?FreeLibrary?函數,從而導致已經將 DLL 附加到進程,則不會調用此入口點函數。
如果 Windows 無法加載 DLL,則進程會嘗試從錯誤中恢復。?例如,進程會通知用戶所發生的錯誤,并要求用戶指定 DLL 的其他路徑。
?
GetProcAddress
顯式鏈接到 DLL 的進程調用?GetProcAddress?來獲取 DLL 導出函數的地址。?
使用返回的函數指針調用 DLL 函數。?
GetProcAddress?將(由?LoadLibrary或?GetModuleHandle?返回的)DLL 模塊句柄和要調用的函數名或函數的導出序號用作參數。
由于是通過指針調用 DLL 函數并且沒有編譯時類型檢查,需確保函數的參數是正確的,以便不會超出在堆棧上分配的內存和不會導致訪問沖突。?
幫助提供類型安全的一種方法是查看導出函數的函數原型,并創建函數指針的匹配 typedef。
FreeLibrary
處理鏈接到 DLL 的顯式調用函數,FreeLibrary?當不再需要 DLL 模塊。?此函數遞減模塊的引用數,如果引用數為零,此函數便從進程的地址空間中取消模塊的映射。
?
#include <iostream> #include <windows.h> //使用函數和某些特殊變量 typedef void (*DLLFunc)(int,int); //確定調用函數的形參 int main() {DLLFunc dllFunc;HINSTANCE hInstLibrary = LoadLibrary("sub.dll");//加載.dllif (hInstLibrary == NULL){FreeLibrary(hInstLibrary);}dllFunc = (DLLFunc)GetProcAddress(hInstLibrary, "sub");//第二個參數為要調用的函數名稱if (dllFunc == NULL){FreeLibrary(hInstLibrary);}dllFunc(5,4);FreeLibrary(hInstLibrary);return(1); }?
總結
以上是生活随笔為你收集整理的动态链接库 仅有.dll文件时候的使用方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cocos2d对动画的各种操作
- 下一篇: boost helloworlld