IsWow64Process()判断系统位数的局限性

背景:干一个擦屁股项目,其中一个要求是把目标从原来的32位改成64位。

程序启动的时候要调用另一个工具,该工具有32位和64位的版本。所以我们的代码中有个判断当前系统是32位还是64位的函数。
这个函数完全是照搬的标准答案:

BOOL IsWow64() 
{ 
    typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); 
    LPFN_ISWOW64PROCESS fnIsWow64Process; 
    BOOL bIsWow64 = FALSE; 
    fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress( GetModuleHandle("kernel32"),"IsWow64Process"); 
    if (NULL != fnIsWow64Process) 
    { 
        fnIsWow64Process(GetCurrentProcess(),&bIsWow64);
    } 
    return bIsWow64; 
} 

然而,改成64位编译之后,这段微软推荐的代码给我返FALSE。
仔细看了CSDN上的解答,才发现这个函数的使用是有前提的:在Win32下。
可能人家的意思是,如果你本身已经是Wow64了,还去判断系统干嘛,不是64位你自己都起不来啊!

找到原因就好解决了。在外面另封一层编译宏开关【WIN_64Bit】,把宏定义到VS的PreProcess设定中就行了,代码中判断如果是64位编译器,直接返回TRUE即可。

#ifndef WIN_64Bit
BOOL IsWow64() 
{ 
    typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); 
    LPFN_ISWOW64PROCESS fnIsWow64Process; 
    BOOL bIsWow64 = FALSE; 
    fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress( GetModuleHandle("kernel32"),"IsWow64Process"); 
    if (NULL != fnIsWow64Process) 
    { 
        fnIsWow64Process(GetCurrentProcess(),&bIsWow64);
    } 
    return bIsWow64; 
} 
#else
BOOL IsWow64() 
{
   return TRUE;
}
#endif

也怪不到以前同事,只满足当时需求嘛。

已有3条评论

  1. 随机背景图很不错,昨天看到是卡卡罗特,今天是健四郎。就是背景色和.post的背景#F7FCF8过于青了。不如白色。

    1. 除非特殊情况,我是不会用白色背景的。去年就是特殊情况。
      背景图可是花了我好久,一共16张,有几张不太容易出现。

  2. 你能在 CSDN 上找到答案,快去买彩票。

  3. 在32位的系统上运行64位的软件?一般运行不了吧??

    1. 不是。是32位的程序调用另一个程序,判断系统是32位还是64位,然后调用另一个程序的对应版本。
      自己是64位的时候其实是不用判断了,就像你说的,32位运行不了。但是一份代码要编成32位版和64位版,所以要处理一下。

你好,新朋友。留言前请先填写昵称邮箱