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