我想检测当前的Windows操作系统是32位还是64位。如何使用C ++实现它?我不想要处理器类型我想要OS的位类型。这是因为您可以在64位处理器上安装32位操作系统。
答案 0 :(得分:44)
要调用的功能是IsWow64Process
或IsWow64Process2
。它会告诉您的32位应用程序是否在64位Windows上运行。
如果程序编译为64位,则它已经知道。
答案 1 :(得分:16)
如果您的代码是64位并且正在运行,那么Windows是64位 - 无需检查。如果您的进程是32位调用IsWow64Process()
- 32位进程在64位Windows上运行WOW64,否则不运行WOW64。
答案 2 :(得分:11)
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
}
答案 3 :(得分:7)
如果您的应用是32位应用,则可以使用IsWow64Process,如果您使用的是x64操作系统,那么它是32位
答案 4 :(得分:5)
您需要使用GetNativeSystemInfo
。鉴于您希望这可以在32位操作系统上运行,您需要使用LoadLibrary
+ GetProcAddress
,以便您可以处理此功能不可用。因此,如果失败,您就知道它是一个32位操作系统。如果没有,SYSTEM_INFO.wProcessorArchitecture
会为您提供真实的处理器类型,而不是模拟的处理器类型。
答案 5 :(得分:3)
使用GetNativeSystemInfo
功能。它获得LPSYSTEM_INFO
参数来获得您想要的内容。
SYSTEM_INFO
结构:
<强>
wProcessorArchitecture
强>
已安装操作系统的处理器体系结构。
答案 6 :(得分:1)
您可以将Windows命令systeminfo
作为程序中的一个进程运行。
#include <stdlib.h>
system("systeminfo");
其中一个返回类别是系统类型。
其输出显示为:System Type: x86-based PC
或System Type: x64-based PC
这可能是一个比其他人提供的解决方案更复杂的解决方案,但我认为我会将其添加为可能性。 (也许你还在追加其他信息。)
答案 7 :(得分:1)
这是另一种方式:GetSystemWow64Directory - “检索WOW64使用的系统目录的路径。这个目录在32位Windows上不存在。”和“在32位Windows上,该函数始终失败,并且扩展错误设置为ERROR_CALL_NOT_IMPLEMENTED
。”
我个人不确定IsWow64Process
的使用情况,因为在MSDN中IsWow64Process
的描述中有文本“请注意,此技术不是检测操作系统是否可靠的方法是64位版本的Windows,因为当前版本的32位Windows中的Kernel32.dll也包含此功能。“
答案 8 :(得分:0)
bool IsX64win()
{
UINT x64test = GetSystemWow64DirectoryA(NULL, 0);
if (GetLastError() == ERROR_CALL_NOT_IMPLEMENTED) return FALSE;
else return TRUE;
}
答案 9 :(得分:0)
Windows较新版本的答案
尽管有几个人和Microsoft Docs为此提出了IsWow64Process2的建议,但我在研究中没有看到任何代码示例。这就是为什么我想向社区贡献这个答案。
根据running 32 bit applications documentation page,Microsoft建议在Windows 10上使用IsWow64Process2,而不是IsWow64Process:
一个32位应用程序可以通过调用IsWow64Process函数(如果以Windows 10为目标,则使用IsWow64Process2)来检测它是否在WOW64下运行。
此功能适用于Windows 10版本1511(客户端)和Windows Server 2016及更高版本。
这有两个参数,可通过这些参数返回信息:pProcessMachine和pNativeMachine。两者都返回Image File Machine Constants
pProcessMachine返回有关目标进程是否在WOW64仿真器下运行以及是否运行的信息。
pNativeMachine返回有关Windows主机体系结构的信息。
使用这两个返回值,可以确定Windows是32位还是64位(这是OP要求的),以及进程是否在WOW64下运行以及进程是32位还是64位。
这是我为此目的编写的函数:
BOOL getBits(BOOL& windowsIs32Bit, BOOL& isWOW64, BOOL& processIs32Bit)
{
USHORT ProcessMachine;
USHORT NativeMachine;
if (!IsWow64Process2(GetCurrentProcess(), &ProcessMachine, &NativeMachine)) {
std::cerr << "IsWOW64Process2 returned FALSE (failed). GetLastError returned: " << GetLastError() << std::endl;
return FALSE;
}
if (ProcessMachine == IMAGE_FILE_MACHINE_UNKNOWN) {
isWOW64 = FALSE;
if (NativeMachine == IMAGE_FILE_MACHINE_IA64 || NativeMachine == IMAGE_FILE_MACHINE_AMD64 || NativeMachine == IMAGE_FILE_MACHINE_ARM64) {
windowsIs32Bit = FALSE;
processIs32Bit = FALSE;
return TRUE;
}
if (NativeMachine == IMAGE_FILE_MACHINE_I386 || NativeMachine == IMAGE_FILE_MACHINE_ARM) {
windowsIs32Bit = TRUE;
processIs32Bit = TRUE;
return TRUE;
}
std::cerr << "Unknown Windows Architecture." << std::endl;
return FALSE;
}
windowsIs32Bit = FALSE;
isWOW64 = TRUE;
processIs32Bit = TRUE;
return TRUE;
}
以下是上述功能的示例用法:
int main() {
BOOL windowsIs32Bit;
BOOL isWOW64;
BOOL processIs32Bit;
if (!getBits(windowsIs32Bit, isWOW64, processIs32Bit)) {
return -1;
}
std::cout << (windowsIs32Bit ? "Windows is 32 bit" : "Windows is 64 bit") << std::endl;
std::cout << (isWOW64 ? "This process *is* running under WOW64" : "This process is *not* running under WOW64") << std::endl;
std::cout << (processIs32Bit ? "This process is 32 bit" : "This process is 64 bit") << std::endl;
return 0;
}
我只能测试上述代码的两种情况,因为我在64位计算机上只有64位Windows。我没有32位计算机,32位Windows,也没有任何ARM计算机。如果有人可以测试其他方案,那么我会反馈一些有关我完成的设计是否对他们有用的反馈。
我写了一个article,它更深入地解释了上面的代码是如何工作的。
答案 10 :(得分:0)
或者,最简单的方法是使用 sizeof(int *)
检查整数指针的大小。
如果为 4,则为 32 位
如果是 8 则它是 64 位
答案 11 :(得分:-1)
static bool is64bitOS()
{
SYSTEM_INFO si;
GetSystemInfo(&si);
if((si.wProcessorArchitecture & PROCESSOR_ARCHITECTURE_IA64)||(si.wProcessorArchitecture & PROCESSOR_ARCHITECTURE_AMD64)==64)
{
return true;
}
else
{
return false;
}
}
答案 12 :(得分:-2)
一个简单的检查是,如果EXE没有运行,那么它是在32位机器上运行的64位可执行文件。 64位计算机将始终运行32位可执行文件。
来自Microsoft,
为32位版本的Windows设计的大多数程序都可以使用 64位版本的Windows。值得注意的例外是许多防病毒软件 程序
为32位版本的Windows设计的设备驱动程序不起作用 在运行64位版本Windows的计算机上。如果你想要 安装只有32位驱动程序的打印机或其他设备 可用,它在64位版本的Windows上无法正常工作。
但是,在Windows中,您还可以检查是否存在Program Files(x86)文件夹作为另一个简单检查。没必要花哨。