2014-01-30 27 views
3

我正在嘗試爲'Version.dll'生成一個代理DLL,但仍然遇到與導出的函數相關的錯誤。代理DLL中的未解析的外部符號

00000000 characteristics 
4A5BC9E3 time date stamp Tue Jul 14 05:27:23 2009 
    0.00 version 
     1 ordinal base 
     15 number of functions 
     15 number of names 

ordinal hint RVA  name 

     1 0 00001B14 GetFileVersionInfoA 
     2 1 00001E40 GetFileVersionInfoByHandle 
     3 2 0000193C GetFileVersionInfoExW 
     4 3 00001AB4 GetFileVersionInfoSizeA 
     5 4 000014E8 GetFileVersionInfoSizeExW 
     6 5 000015FC GetFileVersionInfoSizeW 
     7 6 00001614 GetFileVersionInfoW 
     8 7 00002820 VerFindFileA 
     9 8 00003F50 VerFindFileW 
    10 9 00002AF0 VerInstallFileA 
    11 A 000043F8 VerInstallFileW 
    12 B   VerLanguageNameA (forwarded to KERNEL32.VerLanguageNameA) 
    13 C   VerLanguageNameW (forwarded to KERNEL32.VerLanguageNameW) 
    14 D 00001B94 VerQueryValueA 
    15 E 000015E0 VerQueryValueW 

我的代碼如下所示:

extern "C" 
{ 
    BOOL WINAPI DllMain(HANDLE hDllHandle, DWORD dwReason, LPVOID lpreserved) 
    { 
     if (dwReason == DLL_PROCESS_ATTACH) 
     { 
      DisableThreadLibraryCalls((HMODULE)hDllHandle); 

      // do stuff 
     } 

     return TRUE; 
    } 

DWORD APIENTRY Wrapper_GetFileVersionInfoSizeExA(__in DWORD dwFlags, __in LPCSTR lpwstrFilename, __out LPDWORD lpdwHandle) 
    { 
     return ::GetFileVersionInfoSizeExA(dwFlags, lpwstrFilename, lpdwHandle); 
    } 

// and so on for the rest 
} 

出口定義文件:

LIBRARY Version 
EXPORTS 
GetFileVersionInfoA=Wrapper_GetFileVersionInfoA 
GetFileVersionInfoByHandle=Wrapper_GetFileVersionInfoByHandle 
GetFileVersionInfoExW=Wrapper_GetFileVersionInfoExW 
GetFileVersionInfoSizeA=Wrapper_GetFileVersionInfoSizeA 
GetFileVersionInfoSizeExW=Wrapper_GetFileVersionInfoSizeExW 
GetFileVersionInfoSizeW=Wrapper_GetFileVersionInfoSizeW 
GetFileVersionInfoW=Wrapper_GetFileVersionInfoW 
VerFindFileA=Wrapper_VerFindFileA 
VerFindFileW=Wrapper_VerFindFileW 
VerInstallFileA=Wrapper_VerInstallFileA 
VerInstallFileW=Wrapper_VerInstallFileW 
VerLanguageNameA=Wrapper_VerLanguageNameA 
VerLanguageNameW=Wrapper_VerLanguageNameW 
VerQueryValueA=Wrapper_VerQueryValueA 
VerQueryValueW=Wrapper_VerQueryValueW 

我使用的是不同的函數名,以防止對包括WINDOWS.H原型重新定義錯誤頭文件。試圖建立上述生成以下錯誤:

1>Main.obj : error LNK2001: unresolved external symbol [email protected] 
1>Main.obj : error LNK2001: unresolved external symbol [email protected] 
1>Main.obj : error LNK2001: unresolved external symbol [email protected] 
1>Main.obj : error LNK2001: unresolved external symbol [email protected] 
1>Main.obj : error LNK2001: unresolved external symbol [email protected] 
1>Main.obj : error LNK2001: unresolved external symbol [email protected] 
1>Main.obj : error LNK2001: unresolved external symbol [email protected] 
1>Main.obj : error LNK2001: unresolved external symbol [email protected] 
1>Main.obj : error LNK2001: unresolved external symbol [email protected] 
1>Main.obj : error LNK2001: unresolved external symbol [email protected] 
1>Main.obj : error LNK2001: unresolved external symbol _VerFin[email protected] 
1>Main.obj : error LNK2001: unresolved external symbol [email protected] 
1>Main.obj : error LNK2001: unresolved external symbol [email protected] 

這是無可否認的我第一次嘗試建立一個代理DLL,所以我可能會丟失一些東西明顯。謝謝。

回答

3

鏈接器錯誤消息告訴你,你的DLL沒有提供GetFileVersionInfoWVerQueryValueA等的定義。事實上,這是一個代理DLL並不真正改變事情。這是標準的,經典的,鏈接器失敗。你已經聲明瞭一個函數,但沒有提供它的定義。

您很可能期望這些函數實現來自系統DLL,Version.dll。在這種情況下,您需要向鏈接程序提供相應的導入庫version.lib以提供定義。

當你遇到這樣的錯誤時,總是值得閱讀documentation。它說:

代碼引用鏈接器無法在庫和對象文件中找到的東西(如函數,變量或標籤)。

在我看來,這並不那麼明顯。您已經引用了已聲明但未定義的內容。

+0

啊,我的道歉 - 我是說我已經加入導入庫,而是認爲錯誤曾與做的印象導出定義文件。沒想到檢查兩次。 – shadeMe

3

您需要將version.lib添加到鏈接器屬性頁面中的其他依賴項。

或者,您可以添加以下代碼:

#pragma comment(lib,"version")