我想检测当前Windows操作系统是32位还是64位。如何使用C ++实现? 我不想要处理器类型,而是想要操作系统的位类型。这是因为您可以在64位处理器上安装32位操作系统。
我想检测当前Windows操作系统是32位还是64位。如何使用C ++实现? 我不想要处理器类型,而是想要操作系统的位类型。这是因为您可以在64位处理器上安装32位操作系统。
需要调用的函数是IsWow64Process
或IsWow64Process2
。它可以告诉你的32位应用程序是否在64位Windows上运行。
如果编译的程序是64位的,则已经知道。
IsWow64Process()
在32位的XP SP2及更高版本中存在。 - Remy Lebeau如果你的代码是64位的并且正在运行,那么Windows就是64位的 - 没有什么需要检查的。如果你的进程是32位的,请调用IsWow64Process()
- 32位进程在64位Windows上运行时会在WOW64中,否则不包含WOW64。
bool getWindowsBit(bool & isWindows64bit)
{
#if _WIN64
isWindows64bit = true;
return true;
#elif _WIN32
BOOL isWow64 = FALSE;
//IsWow64Process is not available on all supported versions of Windows.
//Use GetModuleHandle to get a handle to the DLL that contains the function
//and GetProcAddress to get a pointer to the function if available.
LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS)
GetProcAddress(GetModuleHandle(TEXT("kernel32")),"IsWow64Process");
if(fnIsWow64Process)
{
if (!fnIsWow64Process(GetCurrentProcess(), &isWow64))
return false;
if(isWow64)
isWindows64bit = true;
else
isWindows64bit = false;
return true;
}
else
return false;
#else
assert(0);
return false;
#endif
}
GetNativeSystemInfo
函数。使用 LPSYSTEM_INFO
参数获取所需内容。
SYSTEM_INFO
结构体:
wProcessorArchitecture
已安装操作系统的处理器架构。
GetSystemInfo
是正确的,但这个答案需要调用GetNativeSystemInfo
。 - Ben VoigtGetNativeSystemInfo
函数。考虑到你希望它在32位操作系统上工作,你需要使用LoadLibrary
+GetProcAddress
来处理这个函数不可用的情况。如果失败了,那么你就知道它是一个32位操作系统。否则,SYSTEM_INFO.wProcessorArchitecture
会给出真实的处理器类型而不是模拟的处理器类型。ERROR_CALL_NOT_IMPLEMENTED
。"IsWow64Process
的使用不确定,因为在MSDN中,在IsWow64Process
的描述中有文本“请注意,这种技术不是可靠的方法来检测操作系统是否为64位版本的Windows,因为当前版本的32位Windows中的Kernel32.dll也包含此功能。”另外一种最简单的方法是使用sizeof(int *)
检查整数指针的大小。
如果是4,则为32位
如果是8,则为64位
bool IsX64win()
{
UINT x64test = GetSystemWow64DirectoryA(NULL, 0);
if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) return FALSE;
else return TRUE;
}
这里有一个未记录的方法...
bool _Is64BitOS(void);
bool _Is64BitOS(void) {
unsigned int version = *((unsigned int)*)0x7FFE026C;
unsigned int address = version == 10 ? 0x7FFE0308 : 0x7FFE0300;
//printf("Running %u-bit system",*((void*)*)address ? 32 : 64);
return (*((void*)*)address ? false,true);
};