[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;