1

我一直在 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 可以编译并且运行良好。

4

1 回答 1

0

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

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

链接设置

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

dumpbin /imports path\to\dll-or-exe | grep SetFileInformationByHandle
              464 SetFileInformationByHandle  <-- disappered
于 2021-07-06T03:37:28.057 回答