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

原创 2015年07月06日 19:22:14

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

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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。

error C2065: 'xxxx' : undeclared identifier

编号:C2065 直译:标识符“xxxx”未定义。 错误分析: 首先,解释一下什么是标识符。标志符是程序中出现的除关键字之外的词,通常由字母、数字和下划线组成,不能以数字开头,不能与关键字重复,...

VS2003编译OGRE error C2065: '__in' : undeclared identifier 解决

编译所需要的东西 WinXP SP3 + MS VS 2003 + CMake 2.8 + Ogre 1.7.1 + Microsoft DirectX SDK (June 2010)+ OgreD...

<Win32_0>error C2065: 'WM_MOUSEWHEEL' : undeclared identifier 解决方案

今天在写一个关于响应WM_MOUSEWHEEL(鼠标滚轮)消息的程序中 , 用vc++6.0编译器编译时 , 却发现编译没通过 , 提示如下: error C2065: 'WM_MOUSEWHEEL'...

error C2065错误带来的操作系统版本问题

Windows新版API往往需要检测系统版本,方便执行不同的API函数,这在vs2008之后的版本似乎更加加强了,这里查阅了资料,看了一下系统宏定义,希望对大家进行软件特别是进行操作系统识别是有好处。...

iOS逆向 error: use of undeclared identifier 'MSHookIvar'

iOS 逆向开发交流群用Theos 编写代码的时候,发现’MSHookIvar’这个编译不通过,找了一圈不知道是什么原因,后面发现是少了一个substrate.h 文件。下载这个文件,然后复制到你工程...

Error:C:\Users\XX\.gradle\native\19\windows-amd64\native-platform.dll.lock (拒绝访问。)

error1:Log path ‘C:\Users\XX\.AndroidStudio2.0\system\log’ is inaccessible.If you have modified the ...

arp error C2065

  • 2008年04月03日 19:18
  • 21KB
  • 下载

fs/binfmt_aout.c:270: error: 'SEGMENT_SIZE' undeclared

Android主要有6部分   Applications (java)--------------------------------    FrameWork (java)=============...

centos安装pycurl出现src/module.c:723: error: ‘CURLPROTO_*’ undeclared错误的解决办法

0.问题 前几天试图在centos上按装pycurl,本以为已轻车熟路:pip install pycurl; 没想到却出现了一堆错误(只截取部分): In file included f...

error C2065: “LOAD_LIBRARY_SEARCH_SYSTEM32”

切换至110_xp后编译报错 error C2065: “LOAD_LIBRARY_SEARCH_SYSTEM32”一时用vs2012(打补丁到Update5)开发基于ATL的项目出现了这个编译错误。...
  • ahacome
  • ahacome
  • 2017年05月14日 10:54
  • 493
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:获取操作系统位数失败之error C2065: 'PROCESSOR_ARCHITECTURE_AMD64' : undeclared identifier
举报原因:
原因补充:

(最多只允许输入30个字)