我正在尝试构build“Version.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头文件的原型重定义错误。 试图build立上述生成以下错误:
1>Main.obj : error LNK2001: unresolved external symbol _GetFileVersionInfoW@16 1>Main.obj : error LNK2001: unresolved external symbol _VerQueryValueA@16 1>Main.obj : error LNK2001: unresolved external symbol _GetFileVersionInfoSizeA@8 1>Main.obj : error LNK2001: unresolved external symbol _VerQueryValueW@16 1>Main.obj : error LNK2001: unresolved external symbol _GetFileVersionInfoSizeExW@12 1>Main.obj : error LNK2001: unresolved external symbol _VerInstallFileA@32 1>Main.obj : error LNK2001: unresolved external symbol _VerInstallFileW@32 1>Main.obj : error LNK2001: unresolved external symbol _GetFileVersionInfoA@16 1>Main.obj : error LNK2001: unresolved external symbol _GetFileVersionInfoExW@20 1>Main.obj : error LNK2001: unresolved external symbol _GetFileVersionInfoSizeW@8 1>Main.obj : error LNK2001: unresolved external symbol _VerFindFileW@32 1>Main.obj : error LNK2001: unresolved external symbol _GetFileVersionInfoSizeExA@12 1>Main.obj : error LNK2001: unresolved external symbol _GetFileVersionInfoExA@20
这是我第一次尝试构build代理DLL,所以我可能会漏掉一些明显的东西。 谢谢。
链接器错误消息告诉你,你的DLL不提供GetFileVersionInfoW
, VerQueryValueA
等的定义。事实上,这是一个代理DLL并不真正改变的事情。 这是标准的,经典的,链接器失败。 你已经声明了一个函数,但没有提供一个定义。
您很可能期望这些函数实现来自系统DLL Version.dll
。 在这种情况下,您需要将相应的导入库version.lib
提供给链接器以提供定义。
当你遇到像这样的错误时,总是值得阅读文档 。 它说:
代码引用链接器无法在库和对象文件中找到的东西(例如函数,变量或标签)。
在我看来,这不是那么清楚。 你已经引用了已经声明但未定义的内容。
您需要将version.lib
添加到链接程序属性页面中的其他依赖项。
或者你可以添加下面的代码:
#pragma comment(lib,"version")