フォーラム


ゲスト  

ようこそ ゲスト さん。このフォーラムに投稿するには 登録が必要です。

ページ: [1]
トピック: Windows が 32 ビット版か 64 ビット版かを判定
Mr.XRAY
メンバー
投稿数: 192
Windows が 32 ビット版か 64 ビット版かを判定
on: 2013/07/24 01:06 Wed

現在の私の知る範囲で,以下に記事を書いておきました.
何故コピーフックの記事にあるかと言うと,たまたま 32 ビットと 64 ビットのテストをしたためです.
[822_コピーフック] [04_Windows が 32 ビット版 か 64 ビット版かの判定]
http://mrxray.on.coocan.jp/Delphi/plSamples/822_ShellCopyHook.htm#04

要約すると,

  • 判定は下のコードで可能である
  • ただし,Windows Server 2008, Windows Server 2003 および Windows XP(SP2) 以降に限る
  • Windows 98, 2000 であれば事実上 32 ビット版のみなので,やはり下のコードで判定できる
  • WMI の Win32_OperatingSystem クラスでも判定できるが,Windows Vista 以降に限る
  • Windows XP (サービスパックなし) と Windows XP(SP1) での判定方法は,現在のところ分からない
//-----------------------------------------------------------------------------
// 32ビットのWindowsか64ビットのWindowsかを調べる関数
// ただし,Windows XPのSP2以上専用
// Windows 2000以前およびWindows XP,XP(SP1)は常に32ビットの判定となる
//
// 64ビット版のWindowsの場合はTrueを返す
//-----------------------------------------------------------------------------
function Is64bitWindows: Boolean;
var
Wow64Proc : function(hProcess: THandle; var Wow64: BOOL): BOOL stdcall;
RetFlag : LongBool;
begin
Result := False;

@Wow64Proc := GetProcAddress(GetModuleHandle('Kernel32.dll'), 'IsWow64Process');

if @Wow64Proc <> nil then begin
Wow64Proc(GetCurrentProcess, RetFlag);

if SizeOf(THandle) = 4 then begin
Result := RetFlag;
end else
if SizeOf(THandle) = 8 then begin
Result := True;
end;
end;
end;
DEKO
管理者
投稿数: 2634
Re: Windows が 32 ビット版か 64 ビット版かを判定
on: 2013/07/24 02:09 Wed

XP 64bit は バージョン 5.2 なのでバージョンが 5.2 かつ、wProductType = VER_NT_WORKSTATION ならば、XP 64bit と判定できます。
それ以前にバージョン 5.2 という事は Server 2003 相当なので、Mr.XRAY さんのコードそのままでイケルと思います。
# ver 5.1 以前は強制 32bit でいいのかな、と。

See Also:
[Windows のバージョンを本格的に判断する。]
http://ht-deko.minim.ne.jp/tech002.html#tech022
[Windows のバージョンを判断して処理を分岐させたい]
http://ht-deko.minim.ne.jp/delphiforum/?vasthtmlaction=viewtopic&t=1018

あえてコードを追加するならば、

  ...
Result := False;

if not CheckWin32Version(5, 2) then // ADD
Exit;

@Wow64Proc := GetProcAddress(GetModuleHandle('Kernel32.dll'), 'IsWow64Process');
...

 
こんな感じですかね?

Mr.XRAY
メンバー
投稿数: 192
Re: Windows が 32 ビット版か 64 ビット版かを判定
on: 2013/07/24 07:06 Wed

なんだぁ,CheckWin32Version でチェックできたんですね.あれま.
というわけで,記事とコードを修正しました.

Mr.XRAY
メンバー
投稿数: 192
Re: Windows が 32 ビット版か 64 ビット版かを判定
on: 2013/07/26 10:31 Fri

最終的に次のようにしました.

  • IsWow64Process 関数が使えれば Windows XP(SP2) 以上
  • この関数で WOW64 で動作しているかを調べて 32, 64 ビットかを判定
  • IsWow64Process 関数がなければ,Windows XP(SP1) 以下なので,CheckWin32Version(5, 2) で調べる
//-----------------------------------------------------------------------------
// 32ビットのWindowsか64ビットのWindowsかを調べる関数
// 64ビット版のWindowsの場合はTrueを返す
//-----------------------------------------------------------------------------
function Is64bitWindows: Boolean;
var
Wow64Proc : function(hProcess: THandle; var Wow64: BOOL): BOOL stdcall;
RetFlag : LongBool;
begin
Result := False;

@Wow64Proc := GetProcAddress(GetModuleHandle('Kernel32.dll'), 'IsWow64Process');

if @Wow64Proc <> nil then begin
Wow64Proc(GetCurrentProcess, RetFlag);

if SizeOf(THandle) = 4 then begin
Result := RetFlag;
end else
if SizeOf(THandle) = 8 then begin
Result := True;
end;
end else begin
//XP-64bit以上
Result := CheckWin32Version(5, 2);
end;
end;
ページ: [1]
WP Forum Server by ForumPress | LucidCrew
バージョン: 1.7.5 ; ページロード: 0.021 sec.