当前位置:编程学习 > VC++ >>

VC++ 如何判断操作系统位数

通过程序中的代码代码,判断当前运行程序的操作系统是32位还是64位的。 有好的方法或者思路的会酌情加分。 ps:sizeof只能判断当前编译程序的位数,而非操作系统的位数。
补充:目前用的是读注册表 PROCESSOR_ARCHITECTURE 键值的方法,得到的是处理器信息,貌似不行啊
追问:这个方法我试过,但是这个得到的pProcessorArchitecture 是处理器信息还是操作系统的信息呢?这个是通过GetVersionEx 的到系统信息,再根据版本号来判断操作系统的。
但是有个问题
X64和X86的win7能区分吗?
Vista呢
答案:方法1,msdn 有相应的例子,代码贴出来给你看看

MSDN有相应Example! 

#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; 
} 



方法2:
GetSystemWow64Directory 
判断这个文件夹是否存在

最后做下广**告哈:www.ubider.com
其他:不可以。楼上说的sizeof(int)更加不靠谱。
sizeof(指针)的大小只跟当前程序的编译设置有关。比如,你用VC编译一个32位的程序,那么sizeof(void *)的值就是32。就算你在64位的windows上运行这个程序,sizeof(void*)还是32,因为这已经在编译的时候就确定了。同样,如果你编译的是一个64位程序,那么sizeof(void*)就是64,就算将来有128位系统,你这个程序里的sizeof(void*)也仍然是64.
sizeof(int)就更加不靠谱,因为C/C++标准只规定了sizeof(int)一定要小于或者等于sizeof(long),但没规定具体应该多大。比如,VC下编译64位程序,sizeof(int)是32。但64位linux程序里,
g++的sizeof(int)是64。
 #include <iostream>
#include <windows.h>

using std::cout;
using std::endl;

void main()
{
    SYSTEM_INFO si;
    LPCSTR pProcessorArchitecture = NULL;
    GetSystemInfo(&si); 
	
    switch (si.wProcessorArchitecture) {
        case PROCESSOR_ARCHITECTURE_AMD64:
            pProcessorArchitecture = "PROCESSOR_ARCHITECTURE_AMD64";
            break;
			
        case PROCESSOR_ARCHITECTURE_IA64:
             pProcessorArchitecture = "PROCESSOR_ARCHITECTURE_IA64";
             break;

        case PROCESSOR_ARCHITECTURE_INTEL:
            pProcessorArchitecture = "PROCESSOR_ARCHITECTURE_INTEL";
            break;

        default:
            pProcessorArchitecture = "PROCESSOR_ARCHITECTURE_UNKNOWN";
       }

       cout << pProcessorArchitecture << endl;	
} enum Win32Type{
	Win32s,
	WinNT3,
	Win95,
	Win98,
	WinME,
	WinNT4,
	Win2000,
	WinXP
};


Win32Type IsShellType()
{
	Win32Type  ShellType;
	DWORD winVer;
	OSVERSIONINFO *osvi;
	
	winVer=GetVersion();
	if(winVer<0x80000000){/*NT */
		ShellType=WinNT3;
		osvi= (OSVERSIONINFO *)malloc(sizeof(OSVERSIONINFO));
		if (osvi!=NULL){
			memset(osvi,0,sizeof(OSVERSIONINFO));
			osvi->dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
			GetVersionEx(osvi);
			if(osvi->dwMajorVersion==4L)ShellType=WinNT4;
			else if(osvi->dwMajorVersion==5L&&osvi->dwMinorVersion==0L)ShellType=Win2000;
			else if(osvi->dwMajorVersion==5L&&osvi->dwMinorVersion==1L)ShellType=WinXP;
			free(osvi);
		}
	}
	else if  (LOBYTE(LOWORD(winVer))<4)
		ShellType=Win32s;
	else{
		ShellType=Win95;
		osvi= (OSVERSIONINFO *)malloc(sizeof(OSVERSIONINFO));
		if (osvi!=NULL){
			memset(osvi,0,sizeof(OSVERSIONINFO));
			osvi->dwOSVersionInfoSize=sizeof(OSVERSIONINFO);
			GetVersionEx(osvi);
			if(osvi->dwMajorVersion==4L&&osvi->dwMinorVersion==10L)ShellType=Win98;
			else if(osvi->dwMajorVersion==4L&&osvi->dwMinorVersion==90L)ShellType=WinME;
			free(osvi);
		}
	}
	return ShellType;
} 

上一个:VC6.0怎么知道工具栏按钮执行的是哪个函数
下一个:vc编写的一个程序

CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,