判斷作業系統是32位元或64位元

 

32位元作業系統尚未淘汰,64位元系統日益漸多的時代,我們的程式需要滿足最大的相容性,

勢必需要同時支援32/64bit作業系統,以服務更多使用者需求,

 

關鍵函數:IsWow64Process
用途:判斷當前的32bit程式是否在Wow64中執行

BOOL WINAPI IsWow64Process(

  _In_  HANDLE hProcess,

  _Out_ PBOOL  Wow64Process

);

 

在這補充個小資訊,為何32位元程式可以在64位元作業系統運作?
是因為在64bit作業系統執行32bit的程式時,程式會運行在64位元作業系統中的模擬的32位元環境執行程式,
這個模擬的環境就叫做Wow64(Windows 32-bit on Windows 64-bit),
所以我們可以在64bit作業系統下,看到一個系統資料夾:C:\Windows\SysWOW64就是用來處理WOW64的主要核心,

翻譯:
32bit程式 + 32bit OS = System32
32bit程式 + 64bit OS = SysWow64
64bit程式 + 32bit OS = 系統會告訴你不能執行!
64bit程式 + 64bit OS = System32
此判斷方法僅限於32位元程式,但判斷絕對精準,所以推薦使用此方法判斷32/64作業系統.

 

程式範例如下:

 

#include <windows.h>
#include <tchar.h>
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS fnIsWow64Process;
BOOL IsWow64()
{
  BOOL bIsWow64 = FALSE;
  //IsWow64Process is not available on all supported versions
  //of Windows. Use GetModuleHandle to get a handle to the
  //DLL that contains the function and GetProcAddress to get
  //a pointer to the function if available.
  fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
     GetModuleHandle(TEXT("kernel32")),"IsWow64Process");
  if(NULL != fnIsWow64Process)
  {
    if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
    {
      //handle error
    }
  }
  return bIsWow64;
}
int _tmain(int argc, _TCHAR* argv[])
{
  TCHAR s_setup[MAX_PATH];
  ZeroMemory(s_setup,sizeof(TCHAR)*MAX_PATH);
  if(IsWow64())
  {
    _tprintf(TEXT("This is a 64bit OS...\n"));
  }
  else
  {
    _tprintf(TEXT("This is a 32bit OS...\n"));
  }
  system("pause");
  return 0;
}

 

 

1. 宣告函數指標:要從Kernel32.dll引用函數,所以宣告一個函數指標,這函數指標功能等同於引用之函數


typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS fnIsWow64Process;

2. 引用IsWow64Process函數:GetProcAddressGetModuleHandleKernel32.dll中引用IsWow64Process函數

fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
GetModuleHandle(TEXT("kernel32")),"IsWow64Process");

3. 判斷是否為64位元作業系統:

fnIsWow64Process == NULL -> 回傳FALSE -> 32位元作業系統
fnIsWow64Process != NULL -> bIsWow64 == FALSE -> 回傳FALSE -> 32位元作業系統
fnIsWow64Process != NULL -> bIsWow64 == TRUE  -> 回傳TRUE  -> 64位元作業系統

 

 

arrow
arrow

    NoSleep 發表在 痞客邦 留言(0) 人氣()