C++获取系统和程序的位数

来源:互联网 发布:浙师大行知学院好不好 编辑:程序博客网 时间:2024/05/21 22:28

1. 概述

如今 64 位系统越来越流行了 , 对于软件开发人员来说 , 掌握 64 位开发技术将会有更好的发展空间 ; 而且经过这几年的发展 , 64 位开发工具也成熟了 , 例如 Visual Studio 2010 等后续版本 ;

关于如何配置64位平台 , MSDN上有详细的介绍 : http://msdn.microsoft.com/zh-cn/library/9yb4317s.aspx

在很多时候 , 我们希望能兼容老系统 , 于是配置了两个编译平台 Win32 和 x64 ;
但光这样做还是不够的 , 因为老系统不支持某些新功能 ; 所以我们需要在运行时动态动态判断 ;
最常见的判断有两种 :

  • 判断程序位数 : 当前程序被编译到了哪个平台 ;
  • 判操作系统位数 : 当前程序是运行在 32 位的操作系统上 , 还是 64 位的操作系统 ;

对于第一种判断程序位数 , 虽然也可以通过配置预处理符号 , 做编译时判定 ; 但该方法稍微有点繁琐 , 而且在有些情况下不太适合 , 例如我想获得程序位数字符串 , 就必须用 #if 等语句写多行代码 ;
对于第二种判操作系统位数 , 那就只有在运行时判断了 ;


2. 代码实例

#include "stdafx.h"#include <Windows.h>#include <stdio.h>#include <tchar.h>#include <conio.h>// 获取程序位数 (被编译为多少位的代码)int GetProgramBits(){    return sizeof(int*) * 8;}// 获取系统信息void SafeGetNativeSystemInfo(__out LPSYSTEM_INFO lpSystemInfo){    if (NULL == lpSystemInfo)    {        return;    }    typedef VOID (WINAPI *FuncGetSystemInfo)(LPSYSTEM_INFO lpSystemInfo);    FuncGetSystemInfo funcGetNativeSystemInfo = (FuncGetSystemInfo)GetProcAddress(GetModuleHandle(_T("kernel32")), "GetNativeSystemInfo");    // 优先使用 "GetNativeSystemInfo" 函数来获取系统信息    // 函数 "GetSystemInfo" 存在系统位数兼容性问题    if (NULL != funcGetNativeSystemInfo)    {        funcGetNativeSystemInfo(lpSystemInfo);    }    else    {        GetSystemInfo(lpSystemInfo);    }}// 获取操作系统位数int GetSystemBits(){    SYSTEM_INFO si;    SafeGetNativeSystemInfo(&si);    if (si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 ||        si.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_IA64 )    {        return 64;    }    return 32;}int _tmain(int argc, _TCHAR* argv[]){    const int nBitCode = GetProgramBits();    const int nBitSys = GetSystemBits();    _tprintf(_T("I am a %d bit Program, run on %d bit System..."), nBitCode, nBitSys);    _getch();    return 0;}

作者 Github : tojohnonly , 博客 : EnskDeCode

原创粉丝点击