VC 64位程序開發心的——獲得程序位數和操作系統位數


  如今64位系統越來越流行了,對於軟件開發人員來說,掌握64位開發技術將會有更好的發展空間。而且經過這幾年的發展,64位開發工具也成熟了,例如Visual Studio 2010。
  關於如何配置64位平台,MSDN上有詳細的介紹——
http://msdn.microsoft.com/zh-cn/library/9yb4317s.aspx
如何:針對 64 位平台配置 Visual C++ 項目

  在很多時候,我們希望能兼容老系統,於是配置了兩個編譯平台——Win32 和 x64。
  但光這樣做還是不夠的,因為老系統不支持某些新功能。所以我們需要在運行時動態動態判斷。
  最常見的判斷有兩種——
1.判斷程序位數:當前程序被編譯到了哪個平台。
2.判操作系統位數:當前程序是運行在32位的操作系統上,還是64位的操作系統。

  對於第一種——判斷程序位數,雖然也可以通過配置預處理符號,做編譯時判定。但該方法稍微有點繁瑣,而且在有些情況下不太適合——例如我想獲得程序位數字符串,就必須用“#if”等語句寫多行代碼。
  對於第二種——判操作系統位數,那就只有在運行時判斷了。

  代碼如下——

#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 *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);
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 %dbit Program, run on %dbit System."), nBitCode, nBitSys);
//
_getch();
return 0;
}

 

  在32位winXP上的運行效果——

  在64位win7上的運行效果——

  注:
1.GetNativeSystemInfo是Windows XP的新增API,用於取得真實系統信息。(32位程序運行在64位系統上時,GetSystemInfo返回的是經過WOW64修改后的信息)
2.IsWow64Process用於判斷某進程是否運行在WOW64下。對於64位程序,Wow64Process參數會返回FALSE。


源碼下載——
http://files.cnblogs.com/zyl910/vcis64.rar


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM