您的位置:首页 > 其它

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

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

#include <stdio.h>

#include <Windows.h>

#include <tchar.h>

// 获取程序位数(被编译为多少位的代码)

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
之类的定义都懒得要。

真是弄得不太明白,没办法,能力有限,当作记录吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: