如何判断操作系统是64位还是32位
64位Wnidows 里面有个叫Wow64的模拟器技术,可以使32位的程序在64位Windows上运行。当你想在程序里面针对32b位/ 64位系统执行不同代码的时候, 需要判断操作系统是32位还是64位。 使用 Windows API函数 GetNativeSystemInfo 可以获得这个信息。
代码示例:
SYSTEM_INFO si;
GetNativeSystemInfo(&si);
if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||
si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 )
{
//64 位操作系统
}
else
{
// 32 位操作系统
}
另外,Windows API 还提供了 IsWow64Process 函数判断程序是不是运行在Wow64模拟器之上。
代码示例:
BOOL bIsWow64 = FALSE;
IsWow64Process(GetCurrentProcess(), &bIsWow64);
需要注意是GetNativeSystemInfo 函数从Windows XP 开始才有, 而 IsWow64Process 函数从 Windows XP with SP2 以及 Windows Server 2003 with SP1 开始才有。 所以使用该函数的时候最好用GetProcAddress。
比较迷惑人的则是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进行编译。
typedef void (WINAPI *LPFN_PGNSI)(LPSYSTEM_INFO);
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_PGNSI pGNSI = (LPFN_PGNSI ) GetProcAddress(
GetModuleHandle(TEXT("kernel32.dll")), "GetNativeSystemInfo");
LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
GetModuleHandle(TEXT("kernel32")),"IsWow64Process");
For Windows
#include <windows.h>
#include <stdio.h>
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)
{
if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
{
return FALSE;
}
else
{
return TRUE;
}
}
return bIsWow64;
}
int main()
{
BOOL f64;
f64 = IsWow64();
if (f64)
printf("64\n");
else
printf("32\n");
}
主要是利用了IsWow64Process,这是一个windows api,如果进程是运行在64位系统上的32位程序,则返回TRUE,我们用32位方式编译这个程序并运行,即可判断操作系统的位数。