免费视频淫片aa毛片_日韩高清在线亚洲专区vr_日韩大片免费观看视频播放_亚洲欧美国产精品完整版

打開(kāi)APP
userphoto
未登錄

開(kāi)通VIP,暢享免費(fèi)電子書(shū)等14項(xiàng)超值服

開(kāi)通VIP
鏈接到 DLL 的可執(zhí)行文件 | Microsoft Docs

可執(zhí)行文件鏈接到 (或加載) DLL 中有兩種:

  • 隱式鏈接,其中操作系統(tǒng)加載該 DLL 加載時(shí)使用它的可執(zhí)行文件。 客戶端可執(zhí)行文件調(diào)用 DLL 的導(dǎo)出的函數(shù),就像是以靜態(tài)方式鏈接和可執(zhí)行文件中包含的函數(shù)。 隱式鏈接有時(shí)稱為靜態(tài)負(fù)載加載時(shí)動(dòng)態(tài)鏈接。

  • 顯式鏈接、 按需在運(yùn)行時(shí) DLL 加載操作系統(tǒng)。 通過(guò)顯式鏈接中使用的 DLL 的可執(zhí)行文件必須進(jìn)行函數(shù)調(diào)用以顯式加載和卸載該 DLL,并訪問(wèn) DLL 導(dǎo)出的函數(shù)。 與不同的是對(duì)靜態(tài)鏈接庫(kù)中的函數(shù)調(diào)用中,客戶端可執(zhí)行文件必須通過(guò)函數(shù)指針的 DLL 中調(diào)用導(dǎo)出的函數(shù)。 顯式鏈接有時(shí)稱為動(dòng)態(tài)負(fù)載運(yùn)行時(shí)動(dòng)態(tài)鏈接。

可執(zhí)行文件可以使用兩種鏈接方法鏈接到同一個(gè) DLL。 此外,這些方法不是相互排斥;一個(gè)可執(zhí)行文件可以隱式鏈接到 DLL 和另一個(gè)可顯式附加到它。

鏈接到 DLL 的可執(zhí)行文件

是使用隱式鏈接還是顯式鏈接是一個(gè)必須進(jìn)行應(yīng)用程序的體系結(jié)構(gòu)決策。 有一些優(yōu)點(diǎn)和缺點(diǎn)的每個(gè)方法。

隱式鏈接

應(yīng)用程序的代碼將調(diào)用一個(gè)導(dǎo)出的 DLL 函數(shù)時(shí)發(fā)生隱式鏈接。 時(shí)調(diào)用的可執(zhí)行文件的源代碼是編譯的或匯編,DLL 函數(shù)調(diào)用中的對(duì)象代碼生成的外部函數(shù)引用。 若要解決此外部引用,該應(yīng)用程序必須使用鏈接的 DLL 的創(chuàng)建者所提供的導(dǎo)入庫(kù) (.lib 文件)。

導(dǎo)入庫(kù)僅包含代碼來(lái)加載的 DLL 以及 DLL 中實(shí)現(xiàn)對(duì)函數(shù)的調(diào)用。 導(dǎo)入庫(kù)中查找一個(gè)外部函數(shù)通知鏈接器,該函數(shù)的代碼是在 DLL 中。 若要解決對(duì) Dll 的外部引用,鏈接器只需將信息添加到指示系統(tǒng)在哪里可以找到 DLL 代碼時(shí)在進(jìn)程啟動(dòng)的可執(zhí)行文件。

系統(tǒng)啟動(dòng)時(shí)包含動(dòng)態(tài)鏈接的引用的程序,它使用信息在程序的可執(zhí)行文件中查找所需的 Dll。 如果找不到該 DLL,系統(tǒng)將終止進(jìn)程,并顯示一個(gè)對(duì)話框,報(bào)告該錯(cuò)誤。 否則,系統(tǒng)將 DLL 模塊映射到進(jìn)程的地址空間。

如果的任何 Dll 具有入口點(diǎn)函數(shù)的初始化和終止代碼如DllMain,操作系統(tǒng)將調(diào)用該函數(shù)。 傳遞給入口點(diǎn)函數(shù)的參數(shù)之一指定指示 DLL 的代碼附加到進(jìn)程。 如果入口點(diǎn)函數(shù)不返回 TRUE,系統(tǒng)將終止進(jìn)程,并報(bào)告錯(cuò)誤。

最后,系統(tǒng)將修改要提供起始地址的 DLL 函數(shù)的進(jìn)程的可執(zhí)行代碼。

程序的代碼的其余部分,如 DLL 代碼映射到進(jìn)程的地址空間,在進(jìn)程啟動(dòng)并加載到僅在需要時(shí)的內(nèi)存時(shí)。 因此,PRELOADLOADONCALL使用.def 文件添加至控制不能再在以前版本的 Windows 中加載的代碼特性的含義。

顯式鏈接

大多數(shù)應(yīng)用程序使用隱式鏈接,因?yàn)樗亲钜子阪溄臃椒ㄊ褂谩?但是,有些的時(shí)候也需要顯式鏈接。 下面是一些常見(jiàn)的原因,若要使用顯式鏈接:

  • 應(yīng)用程序不知道它直到運(yùn)行時(shí)加載的 DLL 的名稱。 例如,應(yīng)用程序可以從配置文件在啟動(dòng)時(shí)獲取該 DLL 導(dǎo)出的函數(shù)的名稱。

  • 使用隱式鏈接的進(jìn)程將終止由操作系統(tǒng)在進(jìn)程啟動(dòng)時(shí)找不到 DLL。 使用顯式鏈接的進(jìn)程未在此情況下終止,并可以嘗試從錯(cuò)誤中恢復(fù)。 例如,進(jìn)程無(wú)法通知錯(cuò)誤的用戶,并讓用戶指定另一個(gè) DLL 路徑。

  • 如果有鏈接具有的 Dll,則也會(huì)終止使用隱式鏈接的進(jìn)程DllMain失敗的函數(shù)。 使用顯式鏈接的進(jìn)程未在此情況下終止。

  • 隱式鏈接到許多 Dll 的應(yīng)用程序可能較慢,若要啟動(dòng),因?yàn)閼?yīng)用程序加載時(shí),Windows 將加載所有 Dll。 若要提高啟動(dòng)性能,應(yīng)用程序隱式只能鏈接到這些 Dll 后需要立即加載,并等待,直到其他 Dll 所需顯式鏈接到它們。

  • 顯式鏈接不再需要使用導(dǎo)入庫(kù)鏈接應(yīng)用程序。 如果 DLL 中的更改會(huì)導(dǎo)致導(dǎo)出序號(hào),若要更改,使用顯式鏈接的應(yīng)用程序不需要重新鏈接它們調(diào)用GetProcAddress使用的名稱以及一個(gè)函數(shù)不是一個(gè)序號(hào)值,而使用隱式鏈接的應(yīng)用程序必須重新鏈接到新的導(dǎo)入庫(kù)。

下面是需要注意的顯式鏈接的兩個(gè)缺點(diǎn):

  • 如果 DLL 具有DllMain入口點(diǎn)函數(shù),操作系統(tǒng)將調(diào)用的線程中調(diào)用的上下文中該函數(shù)LoadLibrary。 如果 DLL 已附加到進(jìn)程由于以前調(diào)用,將不會(huì)調(diào)用入口點(diǎn)函數(shù)LoadLibrary已有沒(méi)有相應(yīng)地調(diào)用FreeLibrary函數(shù)。 顯式鏈接可能導(dǎo)致問(wèn)題,如果 DLL 使用DllMain函數(shù)來(lái)執(zhí)行的進(jìn)程的每個(gè)線程初始化,因?yàn)榫€程已存在時(shí)LoadLibrary(或AfxLoadLibrary) 稱為未初始化。

  • 如果 DLL 聲明靜態(tài)作用域數(shù)據(jù)作為__declspec(thread),如果顯式鏈接,它可能會(huì)導(dǎo)致保護(hù)錯(cuò)誤。 通過(guò)調(diào)用加載 DLL 后LoadLibrary,它會(huì)導(dǎo)致保護(hù)錯(cuò)誤,只要代碼引用此數(shù)據(jù)。 (靜態(tài)作用域數(shù)據(jù)包括全局和局部靜態(tài)項(xiàng)。)因此,當(dāng)您創(chuàng)建 DLL,您應(yīng)避免使用線程本地存儲(chǔ)或提示 DLL 用戶有關(guān)的動(dòng)態(tài)加載 DLL 的隱患。 有關(guān)詳細(xì)信息,請(qǐng)參閱在動(dòng)態(tài)鏈接庫(kù) (Windows SDK) 中使用線程本地存儲(chǔ)區(qū)。

鏈接到 DLL 的可執(zhí)行文件

若要使用的隱式鏈接的 DLL,客戶端的可執(zhí)行文件必須從該 DLL 的提供程序獲得這些文件:

  • 一個(gè)或多個(gè)標(biāo)頭文件 (.h 文件),包含導(dǎo)出的數(shù)據(jù),函數(shù)的聲明和/或C++DLL 中的類。 類、 函數(shù)和 DLL 導(dǎo)出的數(shù)據(jù)必須所有標(biāo)記為__declspec(dllimport)標(biāo)頭文件中。 有關(guān)詳細(xì)信息,請(qǐng)參閱dllexport、 dllimport

  • 導(dǎo)入庫(kù)鏈接到可執(zhí)行文件。 生成 DLL 時(shí),鏈接器創(chuàng)建的導(dǎo)入庫(kù)。 有關(guān)詳細(xì)信息,請(qǐng)參閱。LIB 文件

  • 實(shí)際的 DLL 文件。

若要使用的 DLL 的隱式鏈接,可執(zhí)行文件必須包括將數(shù)據(jù),函數(shù)聲明的頭文件或C++中每個(gè)源文件,其中包含對(duì)導(dǎo)出的數(shù)據(jù)、 函數(shù)和類的調(diào)用的 DLL 的導(dǎo)出類。 從編碼的角度來(lái)看,對(duì)導(dǎo)出的函數(shù)調(diào)用是就像任何其他函數(shù)調(diào)用一樣。

若要生成的調(diào)用的可執(zhí)行文件,必須使用導(dǎo)入庫(kù)鏈接。 如果使用外部生成文件或生成系統(tǒng)時(shí),指定在其中列出的其他對(duì)象 (.obj) 文件的導(dǎo)入庫(kù)或鏈接的庫(kù)的文件名稱。

操作系統(tǒng)必須能夠找到 DLL 文件加載調(diào)用可執(zhí)行文件時(shí)。 這意味著你的應(yīng)用程序必須部署或安裝應(yīng)用程序時(shí)驗(yàn)證 DLL 存在。

如何顯式鏈接到 DLL

若要使用的顯式鏈接的 DLL,應(yīng)用程序必須進(jìn)行函數(shù)調(diào)用以在運(yùn)行時(shí)顯式加載該 DLL。 若要顯式鏈接到 DLL,應(yīng)用程序必須:

  • 調(diào)用LoadLibraryLoadLibraryEx,或類似的功能,若要加載的 DLL,并獲取模塊句柄。

  • 調(diào)用GetProcAddress獲取函數(shù)指針到每個(gè)導(dǎo)出的應(yīng)用程序調(diào)用的函數(shù)。 應(yīng)用程序調(diào)用 DLL 函數(shù)通過(guò)指針,因?yàn)榫幾g器不生成外部引用,因此無(wú)需使用導(dǎo)入庫(kù)鏈接。 但是,您必須具有typedefusing調(diào)用導(dǎo)出函數(shù)的調(diào)用簽名定義的語(yǔ)句。

  • 調(diào)用FreeLibrary完成 DLL。

例如,此示例函數(shù)將調(diào)用LoadLibrary加載名為"MyDLL"的 DLL 調(diào)用GetProcAddress若要獲取指向名為"DLLFunc1"的函數(shù)的調(diào)用函數(shù)并將結(jié)果,保存,然后調(diào)用FreeLibrary卸載該 DLL。

C
#include "windows.h"typedef HRESULT (CALLBACK* LPFNDLLFUNC1)(DWORD,UINT*);HRESULT LoadAndCallSomeFunction(DWORD dwParam1, UINT * puParam2){    HINSTANCE hDLL;               // Handle to DLL    LPFNDLLFUNC1 lpfnDllFunc1;    // Function pointer    HRESULT hrReturnVal;    hDLL = LoadLibrary("MyDLL");    if (NULL != hDLL)    {        lpfnDllFunc1 = (LPFNDLLFUNC1)GetProcAddress(hDLL, "DLLFunc1");        if (NULL != lpfnDllFunc1)        {            // call the function            hrReturnVal = lpfnDllFunc1(dwParam1, puParam2);        }        else        {            // report the error            hrReturnVal = ERROR_DELAY_LOAD_FAILED;        }        FreeLibrary(hDLL);    }    else    {        hrReturnVal = ERROR_DELAY_LOAD_FAILED;    }    return hrReturnVal;}

不同于在此示例中,在大多數(shù)情況下應(yīng)調(diào)用LoadLibraryFreeLibrary僅一次是在你的應(yīng)用程序?qū)τ诮o定的 DLL,尤其是要在 DLL 中調(diào)用多個(gè)函數(shù)或調(diào)用 DLL 函數(shù)重復(fù)。

本站僅提供存儲(chǔ)服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊舉報(bào)。
打開(kāi)APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
Win32環(huán)境下dll編程原理
Visual C++中動(dòng)態(tài)鏈接庫(kù)技術(shù)淺談
動(dòng)態(tài)庫(kù)、靜態(tài)庫(kù)、運(yùn)行時(shí)庫(kù)、引入庫(kù)之間的區(qū)別
Qt DLL總結(jié)【一】-鏈接庫(kù)預(yù)備知識(shí) - 柳北風(fēng)兒~~~~~~~欲宇仙炅 - ITeye技術(shù)網(wǎng)站
動(dòng)態(tài)鏈接庫(kù)創(chuàng)建與使用
如何在MFC中使用動(dòng)態(tài)鏈接庫(kù)
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長(zhǎng)圖 關(guān)注 下載文章
綁定賬號(hào)成功
后續(xù)可登錄賬號(hào)暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點(diǎn)擊這里聯(lián)系客服!

聯(lián)系客服