获取操作系统位数失败之error C2065: 'PROCESSOR_ARCHITECTURE_AMD64' : undeclared identifier

         前段时间做了个东西,涉及到兼容性问题,反正是各种查资料,其中有想到在代码中先判断当前操作系统位数再动态处理,网上代码很多也基本一样。本不想干这种复制粘贴赤裸裸地造成网络资源冗余的蠢事,但为了更好地说明问题(其中有些问题都是基本问题,但我确实疑惑了),我只有骗自己,“记下来吧,以后用到的时候也好找不是”。代码如下(感谢原创作者):

#include
#include
#include
// 获取程序位数(被编译为多少位的代码)
int GetProgramBits()
{
    return sizeof(int*) * 8;
}
// 安全的取得真实系统信息
VOID SafeGetNativeSystemInfo(LPSYSTEM_INFO lpSystemInfo)
{
    if (NULL==lpSystemInfo)    return;
    typedef VOID (WINAPI *LPFN_GetNativeSystemInfo)(LPSYSTEM_INFO lpSystemInfo);
    LPFN_GetNativeSystemInfo fnGetNativeSystemInfo = (LPFN_GetNativeSystemInfo)GetProcAddress( GetModuleHandle(_T("kernel32")), "GetNativeSystemInfo");;
    if (NULL != fnGetNativeSystemInfo)
    {
        fnGetNativeSystemInfo(lpSystemInfo);
    }
    else
    {
        GetSystemInfo(lpSystemInfo);
    }
}
// 获取操作系统位数
int GetSystemBits()
{
    SYSTEM_INFO si;
    SafeGetNativeSystemInfo(&si);
    //printf("%d\n",si.wProcessorArchitecture);//测试用看看输出什么值
    if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||   //PROCESSOR_ARCHITECTURE_AMD64出现未定义错误
         si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 )        //而PROCESSOR_ARCHITECTURE_IA64 没有错误
    {
        return 64;
    }
    return 32;
}
void main()
{
    int nBitCode = GetProgramBits();
    int nBitSys = GetSystemBits();
    printf("I am a %dbit Program, run on %dbit System.\n", nBitCode, nBitSys);

}

在VC6.0下新建工程,执行上面代码直接出现“error C2065: 'PROCESSOR_ARCHITECTURE_AMD64' : undeclared identifier”。

我注释掉出错位置:

          if (/*si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 || */ si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 )

执行代码,得到结果是我的操作系统是32位的,右键“计算机”->“属性”,可以看到我的是64位的,显然不对。

去掉注释,尝试加载kernel32.dll动态链接库(尽管上述代码中好像有加载,但还是试一下):#import  "kernel32.dll"

去掉注释,尝试加载kernel32.lib静态链接库:#pragma comment(lib,"kernel32.lib")

均失败,应该是我的VC环境问题,咋办。没办法了,没声明是吧,那我给你声明,就是这么嚣张(开个玩笑,只是突然想到,打算试一试)。

         可以看到我在上述代码GetSystemBits()函数中加了个输出语句,就是想看看si.wProcessorArchitecture(毕竟人家通过这个值来判断系统位数)值为多少,结果为9。很好,我只要定义PROCESSOR_ARCHITECTURE_AMD64 值为9不就行了,那在哪定义呢,就定义在和PROCESSOR_ARCHITECTURE_IA64 一样的位置吧,在VC中“选中PROCESSOR_ARCHITECTURE_IA64” ->“右键”->“转到PROCESSOR_ARCHITECTURE_IA64 的定义”,这样就跳到定义处了,增加“#define PROCESSOR_ARCHITECTURE_AMD64 9”即可。

         重新执行代码,成功!。。。这算什么啊,输出个9,你就定义成9,要是输出个8,你就定义个8,这什么跟什么啊!其实,我之所以觉得PROCESSOR_ARCHITECTURE_AMD64 应该是9,有几个原因:

              1、因为它输出9(废话) 。

              2、这个代码在网上到处都是,说明应该是可行的,出现这样的错误,很可能是我的电脑环境原因 。

              3、事实上我的电脑真的是64位的,同时也是AMD的处理器。

        哈哈,理由确实有点牵强啊。。到其他电脑上试试看,哇,试了几台电脑,都是win7的,有32、64位,都出现了未定义错误问题,但用上述方法都能成功。值得注意的是,这只是一种尝试,带着一种不明所以,为保险起见,PROCESSOR_ARCHITECTURE_AMD64 的定义直接在当前文件定义即可,若定义在上述所说的文件内,谁知道会不会造成某种冲突,或者改个名字,再者直接判断si.wProcessorArchitecture是不是9就行,连PROCESSOR_ARCHITECTURE_AMD64 之类的定义都懒得要。

       真是弄得不太明白,没办法,能力有限,当作记录吧!

你可能感兴趣的:(C/C++,CC++,获取操作系统为数)