我一直在VS2005项目中使用GetFileInformationByHandleEx例程。那时函数可以使用FileExtd.h和FileExtd.lib,你必须手动下载它。现在我想将项目迁移到VS2010,我发现新SDK附带了一个FileExtd.lib。
在VS2010中,GetFileInformationByHandleEx在winbase.h中声明,但是为了保持与WindowXP的兼容性,我必须声明一个具有较低值的_WIN32_WINNT(如NTDDI_WINXP)来禁用例程定义。否则它将静态链接到kernel32.dll(其中例程在WinXP上不可用)。因此,我认为解决方案是将旧的FileExtd.h与VS2010版本的FileExtd.lib结合使用。但如果我这样做,我有以下链接错误:
1>fileextd.lib(fileextd.obj) : error LNK2019: unresolved external symbol __imp__RtlSetLastWin32Error@4 referenced in function _BaseSetLastNTError@4
1>fileextd.lib(fileextd.obj) : error LNK2019: unresolved external symbol __imp__NtWaitForSingleObject@12 referenced in function _GetFileInformationByHandleEx@16
我试图保留winbase.h的声明并在kernel32.lib之前声明FileExtd.lib,但它仍然链接到kernel32.dll。
此外,是否可以将使用其他版本的Visual Studio编译的库组合在一起?我问这个是因为我在我的VS2010项目中使用VS2005版本,如果是FileExtd.lib,它编译并且工作得很好。
答案 0 :(得分:0)
我遇到了同样的问题。在 FileExtd.lib
命令行中指定 kernel32.lib
before link.exe
应该没问题。这是我在 Visual Studio 2010 中的设置,它在 Windows 10 下运行,同时为 XP 构建目标。
在配置属性/链接器/输入/附加依赖项下,添加 FileExtd.lib
before %(AdditionalDependencies)
。
生成的 DLL 不需要来自 kernel32.dll 的符号 GetFileInformationByHandle
,这可以通过运行 dumpbin
实用程序来保证。
dumpbin /imports path\to\dll-or-exe | grep SetFileInformationByHandle
464 SetFileInformationByHandle <-- disappered