在Windows XP上使用FileExtd.lib和Visual Studio 2010

时间:2012-05-28 13:08:21

标签: visual-studio-2010

我一直在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,它编译并且工作得很好。

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。在 FileExtd.lib 命令行中指定 kernel32.lib before link.exe 应该没问题。这是我在 Visual Studio 2010 中的设置,它在 Windows 10 下运行,同时为 XP 构建目标。

在配置属性/链接器/输入/附加依赖项下,添加 FileExtd.lib before %(AdditionalDependencies)

Link Setting

生成的 DLL 不需要来自 kernel32.dll 的符号 GetFileInformationByHandle,这可以通过运行 dumpbin 实用程序来保证。

dumpbin /imports path\to\dll-or-exe | grep SetFileInformationByHandle
              464 SetFileInformationByHandle  <-- disappered
相关问题