我正在用Visual Studio C ++编写一个程序,它需要在任何运行Windows XP 32位或更高版本的Windows操作系统的计算机上以本地方式运行32位进程。 该程序需要能够访问计算机上的C:\Windows\system32\
文件夹,而不pipe程序是在64位还是在32位系统上运行。 为此,我使用Wow64DisableWow64FsRedirection
来禁用Windows通常对32位进程的redirect,并将它们发送到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位,因此是否跳过调用,而不添加另一个调用本身打破了兼容性,如需要XP Service Pack 2的IsWow64Process()
。
tl; dr:如何在不使用消费者64位Windows出现之后引入的任何调用的情况下,如何确定系统是64位还是32位。
继续使用Wow64DisableWow64FsRedirection
,但不要静态导入它。 而是使用动态绑定( GetProcAddress
)或延迟加载,其中任何一个都可以让你处理一个丢失的函数而不会崩溃(或者更糟糕的是,甚至没有启动,这是目前的情况)。
只是不要担心系统的位。 如果该功能存在,请调用它。
typedef BOOL WINAPI fntype_Wow64DisableWow64FsRedirection(PVOID *OldValue); auto pfnWow64DisableWow64FsRedirection = (fntype_Wow64DisableWow64FsRedirection*)GetProcAddress(GetmoduleeHandleA("kernel32.dll"), "Wow64DisableWow64FsRedirection"); if (pfnWow64DisableWow64FsRedirection) { // function found, call it via pointer PVOID arg; (*pfnWow64DisableWow64FsRedirection)(&arg); } else { // function was missing }
现在链接器将不会找到一个名为Wow64DisableWow64FsRedirection
的未解析符号,因此它不会将该函数放入导入表中,Windows在启动过程中不会去查找它。