[Delphi] 64 位元存取

[Delphi] 64 位元存取

由於目前的許多作業系統都已經是 64 位元環境 (簡稱 x64) ,雖然在上面也允許 32 位元的程式仍然可以執行,但為了做區隔,因此在作業系統上會自動將 32 位元程式在存取 Windows\System32 和 Program Files 目錄的時候,將其重新導向到 Windows\SysWOW64 和 Program Files (x86) 下面,雖然這樣可以避免 32 位元呼叫到 64 位元程式避免錯誤,在大部分的情況下這樣都是沒有問題的。

然而有些時候我們真的需要去存取 64 位元環境下的檔案時 ( ex: 執行 PowerShell 或者是判斷 SQL Server 64 位元的版本 ),我們就要使用 Kernel32 所提供的兩個 function 來做判斷:

 

  • IsWow64Process : Determines whether the specified process is running under WOW64 ( 判斷特定的 Process 是否在 x64 位元的環境下執行 )
  • Wow64EnableWow64FsRedirection : Enables or disables file system redirection for the calling thread ( 是否啟用 x64 的重新導向功能 )

 

因此 Delphi 的程式可以參考 MSDN 做出類似的 function

 


	
   1:  function IsWow64Process: Boolean; 
   2:  type 
   3:    TIsWow64Process = function(hProcess: THANDLE; var Wow64Process: BOOL):BOOL;stdcall; 
   4:  var 
   5:    mDLL : THandle ; 
   6:    mIsWow64 : BOOL; 
   7:    mIsWow64Process : TIsWow64Process ; 
   8:  begin 
   9:    mDLL := GetModuleHandle('kernel32.dll'); 
  10:    if (mDLL>0) then 
  11:    begin 
  12:      mIsWow64Process := GetProcAddress( mDLL, 'IsWow64Process' ); 
  13:      mIsWow64Process(GetCurrentProcessId, mIsWow64); 
  14:      Result := mIsWow64 ; 
  15:    end 
  16:    else 
  17:      Result := False ; 
  18:  end;

 


   1:  function Wow64EnableWow64FsRedirection( const Enable: Boolean): Boolean; 
   2:  type 
   3:    TWow64EnableWow64FsRedirection = function( EnableFsRedirection: BOOL):BOOL;stdcall; 
   4:  var 
   5:    mDLL : THandle ; 
   6:    mRedirection : TWow64EnableWow64FsRedirection ; 
   7:  begin 
   8:    mDLL := GetModuleHandle('kernel32.dll'); 
   9:    if (mDLL>0) then 
  10:    begin 
  11:      mRedirection := GetProcAddress( mDLL, 'Wow64EnableWow64FsRedirection' ); 
  12:      Result := mRedirection(Enable); 
  13:    end 
  14:    else 
  15:      Result := False ; 
  16:  end;