现在vista或者win7的系统有64位的(x64),有时候程序需要判断所运行的系统是64位的还是32位的,根据判断结果来进行不同的处理。那么如何才能准确判断操作系统是64位的还是32位的?

2010-11-16 00:10:40

5 Answers

使用kernel32的导出函数IsWow64Process,我在加载驱动的时候使用这个方法,是64位的不Hook。

#include <windows.h> typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL); LPFN_ISWOW64PROCESS fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(GetModuleHandle( "kernel32 "), "IsWow64Process "); BOOL IsWow64() { BOOL bIsWow64 = FALSE; if (NULL != fnIsWow64Process) { if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64)) {// handle error std::cout < < "Handle Error " < <std::endl; } } return bIsWow64; }

2010-11-16 02:22:39

在MSDN上看到获得系统信息的函数:Getting the System Version
函数内部已经判断了64位和32位,现修改部分逻辑:

#include 
#include 
#include 
#include 

#pragma comment(lib, "User32.lib")

#define BUFSIZE 256

typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO);
typedef BOOL (WINAPI *PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD);

BOOL GetOSBitString( LPTSTR pszOS)
{
OSVERSIONINFOEX osvi;
SYSTEM_INFO si;
PGNSI pGNSI;
BOOL bOsVersionInfoEx;
DWORD dwType;

ZeroMemory(&si, sizeof(SYSTEM_INFO));
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX));

osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX);
bOsVersionInfoEx = GetVersionEx((OSVERSIONINFO*) &osvi);

if(bOsVersionInfoEx != NULL ) return 1;

pGNSI = (PGNSI) GetProcAddress(
GetModuleHandle(TEXT("kernel32.dll")), 
"GetNativeSystemInfo");
if(NULL != pGNSI)
pGNSI(&si);
else GetSystemInfo(&si);

if ( VER_PLATFORM_WIN32_NT==osvi.dwPlatformId && 
osvi.dwMajorVersion > 4 )
{
if ( osvi.dwMajorVersion >= 6 )
{
if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 )
StringCchCat(pszOS, BUFSIZE, TEXT("64-bit" ));//判断出是64位
else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL )
StringCchCat(pszOS, BUFSIZE, TEXT("32-bit"));//判断出是32位
}
return TRUE; 
}

else
{  
printf( "This sample does not support this version of Windows.\n");
return FALSE;
}
}

int __cdecl _tmain()
{
TCHAR szOS[BUFSIZE];

if( GetOSBitString( szOS ) )
_tprintf( TEXT("\n%s\n"), szOS );
}
2010-11-16 04:05:34

1、IsWow64Process,XPSP2以上系统支持。
2、GetSystemInfo从95/NT开始就支持了,不能用于判断WOW64;GetNativeSystemInfo从XP开始支持,在程序中包含Windows.h前需要#define _WIN32_WINNT 0x0501以上。
3、与处理器个数无关。

#include   
#include   
#include   
#include   

#pragma comment(lib, "User32.lib") 

#define BUFSIZE 256 

typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); 
typedef BOOL (WINAPI *PGPI)(DWORD, DWORD, DWORD, DWORD, PDWORD); 

BOOL GetOSDisplayString( LPTSTR pszOS) 
{ 
OSVERSIONINFOEX osvi; 
SYSTEM_INFO si; 
PGNSI pGNSI; 
PGPI pGPI; 
BOOL bOsVersionInfoEx; 
DWORD dwType; 

ZeroMemory(&si, sizeof(SYSTEM_INFO)); 
ZeroMemory(&osvi, sizeof(OSVERSIONINFOEX)); 

osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOEX); 

if( !(bOsVersionInfoEx = GetVersionEx ((OSVERSIONINFO *) &osvi)) ) 
return 1; 

// Call GetNativeSystemInfo if supported or GetSystemInfo otherwise. 

pGNSI = (PGNSI) GetProcAddress( 
GetModuleHandle(TEXT("kernel32.dll")),  
"GetNativeSystemInfo"); 
if(NULL != pGNSI) 
pGNSI(&si); 
else GetSystemInfo(&si); 

if ( VER_PLATFORM_WIN32_NT==osvi.dwPlatformId &&  
osvi.dwMajorVersion > 4 ) 
{ 
StringCchCopy(pszOS, BUFSIZE, TEXT("Microsoft ")); 

// Test for the specific product. 

if ( osvi.dwMajorVersion == 6 ) 
{ 
if( osvi.dwMinorVersion == 0 ) 
{ 
if( osvi.wProductType == VER_NT_WORKSTATION ) 
StringCchCat(pszOS, BUFSIZE, TEXT("Windows Vista ")); 
else StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2008 " )); 
} 

if ( osvi.dwMinorVersion == 1 ) 
{ 
if( osvi.wProductType == VER_NT_WORKSTATION ) 
StringCchCat(pszOS, BUFSIZE, TEXT("Windows 7 ")); 
else StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2008 R2 " )); 
} 

pGPI = (PGPI) GetProcAddress( 
GetModuleHandle(TEXT("kernel32.dll")),  
"GetProductInfo"); 

pGPI( osvi.dwMajorVersion, osvi.dwMinorVersion, 0, 0, &dwType); 

switch( dwType ) 
{ 
case PRODUCT_ULTIMATE: 
StringCchCat(pszOS, BUFSIZE, TEXT("Ultimate Edition" )); 
break; 
case PRODUCT_PROFESSIONAL: 
StringCchCat(pszOS, BUFSIZE, TEXT("Professional" )); 
break; 
case PRODUCT_HOME_PREMIUM: 
StringCchCat(pszOS, BUFSIZE, TEXT("Home Premium Edition" )); 
break; 
case PRODUCT_HOME_BASIC: 
StringCchCat(pszOS, BUFSIZE, TEXT("Home Basic Edition" )); 
break; 
case PRODUCT_ENTERPRISE: 
StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition" )); 
break; 
case PRODUCT_BUSINESS: 
StringCchCat(pszOS, BUFSIZE, TEXT("Business Edition" )); 
break; 
case PRODUCT_STARTER: 
StringCchCat(pszOS, BUFSIZE, TEXT("Starter Edition" )); 
break; 
case PRODUCT_CLUSTER_SERVER: 
StringCchCat(pszOS, BUFSIZE, TEXT("Cluster Server Edition" )); 
break; 
case PRODUCT_DATACENTER_SERVER: 
StringCchCat(pszOS, BUFSIZE, TEXT("Datacenter Edition" )); 
break; 
case PRODUCT_DATACENTER_SERVER_CORE: 
StringCchCat(pszOS, BUFSIZE, TEXT("Datacenter Edition (core installation)" )); 
break; 
case PRODUCT_ENTERPRISE_SERVER: 
StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition" )); 
break; 
case PRODUCT_ENTERPRISE_SERVER_CORE: 
StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition (core installation)" )); 
break; 
case PRODUCT_ENTERPRISE_SERVER_IA64: 
StringCchCat(pszOS, BUFSIZE, TEXT("Enterprise Edition for Itanium-based Systems" )); 
break; 
case PRODUCT_SMALLBUSINESS_SERVER: 
StringCchCat(pszOS, BUFSIZE, TEXT("Small Business Server" )); 
break; 
case PRODUCT_SMALLBUSINESS_SERVER_PREMIUM: 
StringCchCat(pszOS, BUFSIZE, TEXT("Small Business Server Premium Edition" )); 
break; 
case PRODUCT_STANDARD_SERVER: 
StringCchCat(pszOS, BUFSIZE, TEXT("Standard Edition" )); 
break; 
case PRODUCT_STANDARD_SERVER_CORE: 
StringCchCat(pszOS, BUFSIZE, TEXT("Standard Edition (core installation)" )); 
break; 
case PRODUCT_WEB_SERVER: 
StringCchCat(pszOS, BUFSIZE, TEXT("Web Server Edition" )); 
break; 
} 
} 

if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 2 ) 
{ 
if( GetSystemMetrics(SM_SERVERR2) ) 
StringCchCat(pszOS, BUFSIZE, TEXT( "Windows Server 2003 R2, ")); 
else if ( osvi.wSuiteMask & VER_SUITE_STORAGE_SERVER ) 
StringCchCat(pszOS, BUFSIZE, TEXT( "Windows Storage Server 2003")); 
else if ( osvi.wSuiteMask & VER_SUITE_WH_SERVER ) 
StringCchCat(pszOS, BUFSIZE, TEXT( "Windows Home Server")); 
else if( osvi.wProductType == VER_NT_WORKSTATION && 
si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64) 
{ 
StringCchCat(pszOS, BUFSIZE, TEXT( "Windows XP Professional x64 Edition")); 
} 
else StringCchCat(pszOS, BUFSIZE, TEXT("Windows Server 2003, ")); 

// Test for the server type. 
if ( osvi.wProductType != VER_NT_WORKSTATION ) 
{ 
if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_IA64 ) 
{ 
if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) 
StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter Edition for Itanium-based Systems" )); 
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) 
StringCchCat(pszOS, BUFSIZE, TEXT( "Enterprise Edition for Itanium-based Systems" )); 
} 

else if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 ) 
{ 
if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) 
StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter x64 Edition" )); 
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) 
StringCchCat(pszOS, BUFSIZE, TEXT( "Enterprise x64 Edition" )); 
else StringCchCat(pszOS, BUFSIZE, TEXT( "Standard x64 Edition" )); 
} 

else 
{ 
if ( osvi.wSuiteMask & VER_SUITE_COMPUTE_SERVER ) 
StringCchCat(pszOS, BUFSIZE, TEXT( "Compute Cluster Edition" )); 
else if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) 
StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter Edition" )); 
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) 
StringCchCat(pszOS, BUFSIZE, TEXT( "Enterprise Edition" )); 
else if ( osvi.wSuiteMask & VER_SUITE_BLADE ) 
StringCchCat(pszOS, BUFSIZE, TEXT( "Web Edition" )); 
else StringCchCat(pszOS, BUFSIZE, TEXT( "Standard Edition" )); 
} 
} 
} 

if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 1 ) 
{ 
StringCchCat(pszOS, BUFSIZE, TEXT("Windows XP ")); 
if( osvi.wSuiteMask & VER_SUITE_PERSONAL ) 
StringCchCat(pszOS, BUFSIZE, TEXT( "Home Edition" )); 
else StringCchCat(pszOS, BUFSIZE, TEXT( "Professional" )); 
} 

if ( osvi.dwMajorVersion == 5 && osvi.dwMinorVersion == 0 ) 
{ 
StringCchCat(pszOS, BUFSIZE, TEXT("Windows 2000 ")); 

if ( osvi.wProductType == VER_NT_WORKSTATION ) 
{ 
StringCchCat(pszOS, BUFSIZE, TEXT( "Professional" )); 
} 
else  
{ 
if( osvi.wSuiteMask & VER_SUITE_DATACENTER ) 
StringCchCat(pszOS, BUFSIZE, TEXT( "Datacenter Server" )); 
else if( osvi.wSuiteMask & VER_SUITE_ENTERPRISE ) 
StringCchCat(pszOS, BUFSIZE, TEXT( "Advanced Server" )); 
else StringCchCat(pszOS, BUFSIZE, TEXT( "Server" )); 
} 
} 

// Include service pack (if any) and build number. 

if( _tcslen(osvi.szCSDVersion) > 0 ) 
{ 
StringCchCat(pszOS, BUFSIZE, TEXT(" ") ); 
StringCchCat(pszOS, BUFSIZE, osvi.szCSDVersion); 
} 

TCHAR buf[80]; 

StringCchPrintf( buf, 80, TEXT(" (build %d)"), osvi.dwBuildNumber); 
StringCchCat(pszOS, BUFSIZE, buf); 

if ( osvi.dwMajorVersion >= 6 ) 
{ 
if ( si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_AMD64 ) 
StringCchCat(pszOS, BUFSIZE, TEXT( ", 64-bit" )); 
else if (si.wProcessorArchitecture==PROCESSOR_ARCHITECTURE_INTEL ) 
StringCchCat(pszOS, BUFSIZE, TEXT(", 32-bit")); 
} 

return TRUE;  
} 

else 
{   
printf( "This sample does not support this version of Windows.\n"); 
return FALSE; 
} 
} 

int __cdecl _tmain() 
{ 
TCHAR szOS[BUFSIZE]; 

if( GetOSDisplayString( szOS ) ) 
_tprintf( TEXT("\n%s\n"), szOS ); 
}
2010-11-16 05:29:17

晕,都用 C++
在命令行里面有个环境变量 PROCESSOR_ARCHITECTURE
可以通过 cmd 来执行

echo %PROCESSOR_ARCHITECTURE%

查看当前是 x86 还是 64

如果想通过 C/C++

#include 
#include 

int main(void)
{
    printf("%s\n", system("echo %PROCESSOR_ARCHITECTURE%"));
    return 0;
}

编译了就能用,不用像他们那样写这么多行,而且不依赖那些 libs


更新

如果是类 Unix 平台,比如 Linux

替换的 shell 命令为


uname -m


如果还是需要环境变量作为参考条件的话,可能会因为发行版本不同,环境变量有没定义

可做为判断平台架构的环境变量为

HOSTTYPE

MACHTYPE


可尝试使用 shell 命令或者替换 printf 后面的参数实现

echo $HOSTTYPE


更新 - java

如果想通过 java 获取命令行的返回值,斑驳提供一个方法:

/** 执行 shell 命令之后返回 String 类型的结果 */ public static StringexecShellStr(String cmd) { // Windows 命令行: String[] cmdStrings = new String[] {"cmd", "/c", cmd}; // 类Unix 命令行: // String[] cmdStrings = new String[] {"sh", "-c", cmd}; String retString = ""; try { Process process = Runtime.getRuntime().exec(cmdStrings); BufferedReader stdout = new BufferedReader(new InputStreamReader( process.getInputStream()), 7777); BufferedReader stderr = new BufferedReader(new InputStreamReader( process.getErrorStream()), 7777); String line = null; while ((null != (line = stdout.readLine())) || (null != (line = stderr.readLine()))) { if (false == isStringEmpty(line)) { retString += line + "\n"; } } } catch (Exception e) { e.printStackTrace(); } return retString; }

比如查看 Windows 的架构

System.out.println(execShellStr("echo %PROCESSOR_ARCHITECTURE%"));

2010-11-16 06:32:05

最简单的办法定义一个指针,sizeof()大小,64位下占8个字节,32位下占4个字节

void *p; if(sizeof(p) == 4) { cout<<"32位机"; }else if(sizeof(p) == 8) { cout<<""64位机"; }

2010-11-16 08:19:07
您不能回答该问题或者回答已经关闭!

相关文章推荐

  • C#中using指令的几种用法

    using + 命名空间名字,这样可以在程序中直接用命令空间中的类型,而不必指定类型的详细命名空间,类似于Java的import,这个功能也是最常用的,几乎每个cs的程序都会用到

  • C#实例解析适配器设计模式

    将一个类的接口变成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起工作的两个类能够一起工作

  • 使用托管C++粘合C#和C++代码(二)

    本文实现一下C++代码调用C#代码的过程。我构造一个简单并且直观的例子:通过C++ UI 触发C# UI.

  • C#开发高性能Log Help类设计开发

    项目中要在操作数据库的异常处理中加入写Log日志,对于商业上有要求,写log时对其它操作尽可能影响小,不能因为加入log导致耗时太多

  • Async和Await使异步编程更简单

    C#5.0中async和await两个关键字,这两个关键字简化了异步编程,之所以简化了,还是因为编译器给我们做了更多的工作

  • C#开发中的反射机制

    反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等

  • C#运行时相互关系

    C#运行时相互关系,包括运行时类型、对象、线程栈和托管堆之间的相互关系,静态方法、实例方法和虚方法的区别等等

  • C#协变和逆变

    “协变”是指能够使用与原始指定的派生类型相比,派生程度更大的类型,“逆变”则是指能够使用派生程度更小的类型

  • C#基础概念之延迟加载

    延迟加载(lazy load)是Hibernate3关联关系对象默认的加载方式,延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作

  • 使用托管C++粘合C#和C++代码(一)

    C#在xml读写,数据库操纵,界面构造等很多方面性能卓越;C++的效率高,是底层开发的必备武器

  • C#中的索引器的简单理解和用法

    C#中的类成员可以是任意类型,包括数组和集合。当一个类包含了数组和集合成员时,索引器将大大简化对数组或集合成员的存取操作

  • 深入C# 序列化(Serialize)、反序列化(Deserialize)

    C#中的序列化和反序列化,序列化是.NET运行时环境用来支持用户定义类型的流化的机制