2009-09-07 253 views
6

我迫切需要幫助,我需要在Visual Studio中管理應用程序依賴項。應用程序僅在特定版本的Windows上鍊接到DLL,可以說Windows 7,並且在其他環境下,不應加載該DLL。我如何能夠實現使用DLL延遲加載,因爲這個話題對我來說是全新的,並且在這個特定的問題上沒有任何好的參考資料。延遲加載DLL

問候

+1

你問延遲加載如何工作,或如何應用它? – xtofl 2009-09-07 09:34:55

回答

8

您的項目可以指定一個DLL它依賴於在需要時,通過在鏈接器/輸入/延遲加載的dll字段中指定它應該,但被加載。對於不同的構建配置,此設置可能有所不同。

+0

Thx爲答覆的人,但你可以giva一個例子或代碼片段,如果它適用:) – 2009-09-07 09:28:16

+4

這是延遲加載點:這是一個配置的事情,而不是代碼的事情。 – xtofl 2009-09-07 09:29:49

+0

措辭出現錯誤:當您說「您所依賴的DLL應該與延遲加載容量相關聯」時,您似乎指的是從它的組件.obj創建該DLL。/DELAY標誌實際上應用於執行_importing_的模塊,而不是_imported_模塊。這也是您可以延遲加載Windows 2000 DLL的原因,這些DLL本來是在沒有這種支持的情況下構建的。 – MSalters 2009-09-07 10:06:06

1

而不是使用延遲加載,你有沒有考慮使用dynamicloadingLoadLibraryGetProcAddress?這可能會更簡單的使用。

typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); 

// Call GetNativeSystemInfo if supported or GetSystemInfo otherwise. 

PGNSI pGNSI; 
SYSTEM_INFO si; 

ZeroMemory(&si, sizeof(SYSTEM_INFO)); 

pGNSI = (PGNSI) GetProcAddress(
    GetModuleHandle(TEXT("kernel32.dll")), 
    "GetNativeSystemInfo"); 
if(NULL != pGNSI) 
    pGNSI(&si); 
else GetSystemInfo(&si); 
+9

如何編寫可由鏈接器自動生成的代碼更簡單? – xtofl 2009-09-07 09:31:01

+2

它很好,如果你只有1個功能,你想打電話...否則它是一個明顯的不好的選擇,伊莫。 – Goz 2009-09-07 09:35:54

+3

-1 - 鏈接器中延遲加載的支持專門用於防止您必須處理LoadLibrary()和GetProcAddress()! – Bids 2010-10-29 10:46:31

10

MSDN有一個很不錯的描述here

基本上你正在做的是設置問題的DLL在延遲加載部分。它將不會加載該DLL,直到您調用該DLL中的某個函數。

從上面的鏈接:

在Visual C++接頭現在支持的DLL的延遲加載。這 免除您需要使用Windows SDK函數LoadLibrary 和GetProcAddress來實現DLL延遲加載。

在Visual C++ 6.0之前,在運行時加載DLL的唯一方法是使用LoadLibrary和GetProcAddress通過 ;操作系統將加載 DLL時使用它的可執行文件或DLL被加載。

從Visual C++ 6.0開始,當與DLL靜態鏈接時, 鏈接器提供延遲加載DLL的選項,直到程序在該DLL中調用 函數。

應用程序可以使用帶輔助函數(默認實現 ,由Visual C++提供)的/DELAYLOAD (Delay Load Import)鏈接器選項來延遲加載DLL。該幫助程序函數將通過爲您調用LoadLibrary和GetProcAddress來運行時加載DLL 。

你應該考慮延遲加載DLL,如果:

你的程序可能無法調用DLL中的函數。

DLL中的函數可能直到執行程序的後期才被調用。

DLL的延遲加載可以在構建 或.EXE或.DLL項目時指定。延遲一個或多個DLL的加載 的.DLL項目本身不應該自己調用Dllmain中的延遲加載入口點 。