MyMSDN

MyMSDN记录开发新知道

IsWow64并不能用来检测是否是Windows 32bit系统还是64bit系统

如何当前操作系统是不是64位?如何判断当前应用程序是否在Wow64下运行?

首先什么是Wow64?很多朋友一看到64就认为这个方法是判断当前系统是否是64bit的,其实不然。Wow64是Windows-On-Windows64的意思,它是指在64位的操作系统上(不是指64位的CPU)运行32位应用程序的兼容平台。

下面是MSDN中一段IsWow64的应用程序:

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

下面的代码用来检测这个程序的结果:

if( IsWow64() == TRUE )
{
    _tprintf(_T("IsWow64() == TRUE\n"));
}
else
{
    _tprintf(_T("IsWow64() == FALSE\n"));
}

让我们编译一下这个程序。

我们需要的是64位的操作系统,比如XP64bit,Windows 2008 R2等都是64bit操作系统。

在64位的操作系统上运行的kernel32.dll中,将会实现IsWow64Process方法,而在32位系统中提供的kernel32.dll中则没有提供相关函数的实现。

比较迷惑人的则是bIsWow64,其实仔细看MSDN中的Remark,会发现:

If the application is a 64-bit application running under 64-bit Windows, the Wow64Process parameter is set to FALSE.也就是说64位应用程序跑在64位的操作系统上,bIsWow64的值将是FALSE而不是TRUE。

因此我们需要分别将我们的程序编译成Win32平台和x64平台的,如果你用Visual Studio进行编译,默认安装则只包含32位的编译器/链接器,即便你是在64位操作系统上安装,也是一样的。你需要在VC++节点下勾选x64选项才可以,Itanium则需要在Server平台下安装才可勾选。然后在编译的时候,分别选择Win32和x64进行编译。

image

编译后,运行,结果如我们分析的一样:

在64位系统上运行Win32编译配置的结果是IsWow64() == TRUE,而x64编译配置的结果是IsWow64() == FALSE。

如果想要知道当前系统是否是64位的,则可以通过下面的方法:

BOOL Is64bitSystem()
{
    SYSTEM_INFO si;
    GetNativeSystemInfo(&si);

    if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||    
        si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 )
    {
        return TRUE;
    }
    else
    {
        return FALSE;
    } 
}

注意:需要注意是GetNativeSystemInfo  函数从Windows XP 开始才有, 而 IsWow64Process  函数从 Windows XP with SP2 以及 Windows Server 2003 with SP1 开始才有。

posted on 2010-09-06 02:06 volnet 阅读(6625) 评论(12)  编辑 收藏 引用 所属分类: C/C++

评论

# re: IsWow64并不能用来检测是否是Windows 32bit系统还是64bit系统 2010-09-06 09:45 溪流

IsWow64Process 的本意并不是检测系统是32位还是64位,而是说当前进程是否跑在 WOW64 虚拟机下。对于32位程序来说,这个函数也可以用来判断系统是否为64位的,并用来实现32位/64位兼容。

对于64位程序来说,你能跑在32位系统下么?  回复  更多评论   

# re: IsWow64并不能用来检测是否是Windows 32bit系统还是64bit系统 2010-09-06 10:26 xxoo

从wProcessorArchitecture 的名字和后面的宏来看,这个貌似是获得的是CPU的位数,而不是操作系统的位数?  回复  更多评论   

# re: IsWow64并不能用来检测是否是Windows 32bit系统还是64bit系统 2010-09-06 10:37 volnet

@溪流
当然不可以  回复  更多评论   

# re: IsWow64并不能用来检测是否是Windows 32bit系统还是64bit系统 2010-09-06 10:41 volnet

@xxoo
wProcessorArchitecture
The processor architecture of the installed operating system.
  回复  更多评论   

# re: IsWow64并不能用来检测是否是Windows 32bit系统还是64bit系统 2010-09-06 11:35 溪流

@volnet
所以,“也就是说64位应用程序跑在64位的操作系统上,bIsWow64的值将是FALSE而不是TRUE”对你来说是没有意义的  回复  更多评论   

# re: IsWow64并不能用来检测是否是Windows 32bit系统还是64bit系统 2010-09-06 11:43 普派

64位应用程序跑在64位的操作系统上,bIsWow64的值将是FALSE而不是TRUE”对你来说是没有意义的   回复  更多评论   

# re: IsWow64并不能用来检测是否是Windows 32bit系统还是64bit系统 2010-09-06 12:37 volnet

@溪流
是,本文要说的就是这个  回复  更多评论   

# re: IsWow64并不能用来检测是否是Windows 32bit系统还是64bit系统 2011-03-18 17:48 bob

你的这篇文章 “标题” 严重错误,“部分言语”有问题。

你写的很细致,但是下面回复你的人 说的都是对的,你好好想想。  回复  更多评论   

# re: IsWow64并不能用来检测是否是Windows 32bit系统还是64bit系统 2011-03-18 23:04 volnet

@bob
我不知道您说的部分言语是哪些?另外你觉得换个什么标题比较好呢?  回复  更多评论   

# re: IsWow64并不能用来检测是否是Windows 32bit系统还是64bit系统 2011-03-19 12:07 溪流

@volnet
看到这哥们的回复,我又看了下自己当时的回复,一开始还真有点不知道当时想表达什么。后来仔细看了下,应该是这么个意思吧:你说 IsWOW64 不能用于检测系统是32位还是64位的,原因是64位程序调用IsWOW64得到的结果不是预期的。我对这个因果推理的逻辑表示费解。既然要检测系统是32位还是64位的,程序本身必须是32位的,64位程序自然只能运行在64位系统下不能运行在32位系统下,所以对64位程序来说,是无所谓“检测”操作系统是不是32位的。IsWOW64确实可以让32位程序检查到操作系统到底是32位还是64位,已经充分地支持了“IsWOW64 可以用于检测系统是32位还是64位的”。。。。好绕,不知道我表达清楚了没有。所以,能不能拿64位程序调用 IsWOW64 的结果说事。  回复  更多评论   

# re: IsWow64并不能用来检测是否是Windows 32bit系统还是64bit系统 2013-06-09 23:44 真的建议改一下,google的rank很高,楼主别误人子弟了。

标题应该改为“IsWow64能用来检测是否是Windows 32bit系统还是64bit系统”。保留文章正文的同时,前面加一句“后面的推论逻辑错误,引以为戒”,即可,哈哈。  回复  更多评论   

# re: IsWow64并不能用来检测是否是Windows 32bit系统还是64bit系统 2014-02-21 09:50 allen

MSDN上说这个函数IsWow64Process在32位系统的dll中也存在,我试验了一下,WIN7 32位是有这个函数IsWow64Process的。  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


特殊功能