【发布时间】:2014-10-14 08:03:49
【问题描述】:
我正在使用 Visual Studio C++ 编写一个程序,该程序需要在运行 Windows XP 32 位或任何更高版本的 Windows 操作系统的任何计算机上作为 32 位进程本机运行。该程序需要能够访问计算机上的C:\Windows\system32\ 文件夹,无论该程序是在 64 位还是 32 位系统上运行。为此,我使用Wow64DisableWow64FsRedirection 禁用Windows 通常对32 位进程执行的重定向,将它们发送到C:\Windows\syswow64。不幸的是,这破坏了兼容性——虽然我的程序可以在 Server 2003 和 XP x64 版本上运行,但只要在 32 位 XP RTM 系统上运行,程序就会失败,给我这个错误:
[Program Name] - Entry Point Not Found
The procedure entry point Wow64DisableWow64FsRedirection could not be located
in the dynamic link library KERNEL32.dll.
由于系统是32位的,调用显然是多余的,但是我想不出办法在运行时判断系统是否是64位,因此是否跳过调用,无需添加另一个本身会破坏兼容性的调用,例如 IsWow64Process(),这需要 XP Service Pack 2。
tl;dr:如何在不使用任何在消费者 64 位 Windows 出现后引入的调用的情况下确定系统是 64 位还是 32 位。 p>
【问题讨论】:
-
像
GetProcAddress一样,然后测试函数是否存在? -
测试是否存在 syswow64 目录?它显然不会出现在 32 位 Windows 上。
-
@Marc-b 这很聪明,但我不能保证用户不会创建一个。这很愚蠢,但用户可能很愚蠢。
-
@dr_andonuts:您确实意识到在您的代码中包含
if (magic_is_64bit()) Wow64DisableWow64FsRedirection();不会阻止 Windows 尝试在 32 位系统上解析Wow64DisableWow64FsRedirection导入,对吧?
标签: c++ windows windows-xp 32bit-64bit