获取操作系统位数失败之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
之类的定义都懒得要。
真是弄得不太明白,没办法,能力有限,当作记录吧!
#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
之类的定义都懒得要。
真是弄得不太明白,没办法,能力有限,当作记录吧!
相关文章推荐
- 八叉树 Octree
- c++中冒号(:)的作用
- 快速排序演示
- Number of 1 Bits
- 从医学的角度看恋爱
- C++中vector的排序问题
- 4个类型转换关键字
- jQuery.fill 数据填充插件
- Java知多少(完结)
- leetCode 21.Merge Two Sorted Lists (合并排序链表) 解题思路和方法
- hdu 4507 - 吉哥系列故事——恨7不成妻(数位dp)
- C++实现字符串之模式匹配(一)
- nyoj 1192——Salvation——————【搜索】
- Eclipseproject标准的文件夹层次
- 【从零单排之微软面试100题系列】04之二叉树中和为某一值的路径
- ClassesTest
- java 中构建可执行 jar 包的几种方式
- etl工具,kettle实现了周期
- ClassesTest
- OC中的单例模式