Delphi Programming / Object Pascal
サイトのトップページへ リンクのページへ ロゴマーク
[掲載 2013年07月07日] [更新 2022年10月13日] Delphi 一般・その他
32 ビットと 64 ビットのアプリ・プロセスの判定と操作
動作確認等 -
[整理番号 - 0410]







01_32 ビットと 64 ビットのアプリ・プロセスの判定と操作


サンプルとしての専用のページはありません。以下の記事を参考にしてください。



64 ビットの Windows で、32 ビットのアプリを実行することを、WOW64 環境ともいいます。例えば「アプリケーションを WOW64 環境で動作させた場合」のように使用することがあります。
WOW64 環境は、32 ビットの Windows には存在しません。
WOW64 は、64 ビットの Windows で 32 ビットアプリを動作させるための仕組みのことです。

64 ビットの Windows で、32 ビットの EXE から 64 ビットの Program Files フォルダ内等のシステム関係ファイルや レジストリの操作を行うには、次のような方法が考えられます。
  • (1) ファイルのリダイレクト機能を無効化してから操作する
  • (2) システム関係フォルダの場合、エクスプローラから起動する方法と同じ方法で操作する
  • (3) システム関係フォルダの場合、仮想ディレクトリを使用して操作する
  • (4) レジストリの場合はアクセスフラグに KEY_WOW64_64KEY を追加する
64 ビットの EXE から 32 ビット関係の同様のファイル類を操作する場合も同じです。レジストリを操作する場合はアクセスフラグにに KEY_WOW64_32KEY を追加します。
いずれの場合も、EXE を実行している Windows が 32 ビット版か 64 ビット版かの判定をして条件分岐による処理が必要になるかも知れません。


[備考 1]
32 ビットの Windows では 32 ビットのアプリと 16 ビットのアプリ (DOS アプリ) が動作しますが、64 ビットのアプリは動作しません。
64 ビットの Windows では、64 ビットのアプリと 32 ビットのアプリが動作しますが、16 ビットのアプリは動作しません。


[備考 2]
32 ビットの Windows では、64 ビットのアプリは作成できません。
64 ビットの Windows では、32 ビットと 64 ビットのアプリのどちらも作成できますが、64 ビットのアプリ (DLL 等も含む) の作成には Delphi XE2 以降のバージョンの Delphi が必要です。





02_起動中のアプリの 32 / 64 ビットをタスクマネージャで確認


タスクマネージャで、現在起動中のアプリが 32 ビット版か 64 ビット版を確認するには、Windows 7 の場合は [プロセス] タブを表示して確認します。*32 の表示があるのが 32 ビット版です。
Windows 10 では (32 ビット) と表示されているのが 32 ビット版のアプリです。


図1
Windows 7 の場合
  • *32 と表示されているのか 32 ビットのアプリ
図2
Windows 10 の場合
  • (32 ビット) と表示されているのが 32 ビットのアプリ




03_システム関係ダイアログで Windows のビットバージョン確認


以下のコマンドを、[ファイル名を指定して実行] のダイアログ、あるいはコマンドプロンプトから実行するとシステム情報のダイアログが表示されます。このダイアログの [システムの種類] でビット数を確認できます。
systeminfo の結果の x86-based PC が 32 ビットです。x64-based PC は 64 ビットです。


control.exe /name Microsoft.System

//コマンドプロンプト専用
systeminfo


Windows 10 では URI スキームを使用して、上の最初のコマンドと同じ内容の設定アプリ (設定パネル) のページを表示できます。以下のコマンドをクリックするか、[ファイル名を指定して実行] のダイアログから実行します。
上のコマンドの場合と同じく、[システムの種類] で確認します。


ms-settings:about






04_EXE や DLL の 32 ビット / 64 ビット判定用プログラム
32bit_or_64bit.zip [869 KB] 2022年10月11日版 (EXEのみ。説明なし)
再配布も転載も自由


EXE, DLL, BPL ファイルの 32 ビットと 64 ビットの判定用プログラムです。エクスプローラからの Drag & Drop にも対応しています。



図3
実行時の画面
  • 以下の拡張子だけに対応
    .exe
    .dll
    .bpl

コマンドラインにも対応しています。下図は、D:\000\test64.exe が 32 ビット か 64 ビットであるかを調べた結果です。Is32_64.exe は、Delphi XE5 のインストール先の [bin] フォルダ内に置いています。対象の EXE ファイル名は、エクスプローラからの Drag & Drop でセットしています。

結果の、32 but と 64 bit は、PE ヘッダの IMAGE_OPTIONAL_HEADER 構造体の Magic メンバの値に基づいた表示です。その後ろの値は、IMAGE_FILE_HEADER 構造体の Machine メンバに基づいた値で、CPU のアーキテクチャを意味します。( ) 内の表記は、そのアーキテクチャを示す意味で使用されています。
本プログラムで判定可能なアーキテクチャは IA64, x86, x64, ARM64 だけです。



図4
コマンドライン

Delphi には TDUMP.EXE という、ファイル構造の情報を取得するコマンドラインツールが付属しています。この TDUMP.EXE を使用して、EXE / DLL / BPL ファイルが 32 ビットであるが 64 ビットであるかを調べることができます。以下の記事を参考にしてください。
TDUMP.EXE は、Delphi XE5 にはありませんが、Delphi XE7 にはあります。


下図は、コマンドラインツール TDUMP.EXE を使用して、D:\000\Project1.exe が 32 ビット か 64 ビットであるかを調べた結果です。コマンドプロンプトは、エクスプローラで D:\000 フォルダを表示して、アドスバーで cmd を実行して起動しています。
AMD64 は、 64 ビットであることを意味しています。32 ビットの時は 80386 です。



図5
TDUMP 使用例

エクスプローラで表示しているファイルのコンテキストメニューに、x86, x64 を検出するためのメニューを追加するシェルエクステンションがあります。
以下の最初のリンクからダウンロードした ZIP 書庫の [FPC] フォルダ内に DLL が 2 つあります。この DLL をシステムに登録します。64 ビット版の Windows の場合は、GetExeInfoShellExt64.dll を登録します。32 ビット版の Windows の場合は、末尾に 64 がない DLL を登録します。



エクスプローラでファイルを表示して、EXE ファイル、または DLL ファイルのコンテキストメニューの [Show target pratform...] をクリックします。



図6
ファイルのコンテキストメニュー
  • [Show target pratform...] を選択
  • 結果はダイアログ表示
    x86 なら 32 ビット
    x64 なら 64 ビット
  • EXE / DLL のみに対応

PC に実装されている CPU の種類は、以下のコマンドをクリックして表示されるダイアログの [プロセッサ] で確認できます。


ms-settings:about


[備考 1。
EXE / DLL / bPL における 32 ビット / 64 ビットは、32 ビットのアーキテクチャでコンパイルされているか、64 ビットのアーキテクチャでコンパイルされているかと言うことです。

TDUMP の実行結果の CPU type の 80386 は、Intel 社が 1985年に発表した 32 ビットの CPU である Intel 80386 に由来する表記です。Intel 80386 系の 32 ビット処理のアーキテクチャは、x86 という表記が一般的に使用されています。
Program Files (x86) の x86 もこの意味です。このフォルダは、x86 アーキテクチャで動作する、つまり、32 ビット用のプログラム関係ファイルの置き場所です。

AMD64 は、AMD 社の 64 ビット専用 CPU で使用されているアーキテクチャの名称です。Intel 社の CPU における 64 ビット処理のアーキテクチャの名称は、Intel64 (発表当初の名称は EM64) です。Intel64 は AMD64 と互換性があります。このことから、どちらでも動作するという意味で、x64 という表記も使用されています。

今回のテストで使用した PC の CPU は、Intel Core i7 です。この CPU は、x86, x64 両方のアーキテクチャを実装しています。


[備考 2]
EXE や DLL は、システム的にパスが通った場所にあれば、ディレクトリの指定なしで使用できます。Delphi のインストール先の [bin] フォルダは、システム的にパスが通っています。
%systemroot%\System32, %systemroot%\SysWOW64 もシステム的にパスが通っていますが、これらのフォルダに置いたファイルは、所有権を設定しないと、Windows の大型アップデートの際に削除されてしまう可能性があります。





05_プロジェクトを 32 ビット / 64 ビットとして同時にコンパイル


Delphi 10.4 では、EXE / DLL のプロジェクトを、32 ビット / 64 ビットの EXE / DLL として同時コンパイルができます。前項の参考リンクの [テスト用の DLL を作る] を参考にしてください。
Delphi 10.4 Community エディションで動作を確認しています。