Delphi がインストールされた環境で、EXE / DLL が 32bit / 64bit いずれなのかを判別する

# はじめに
たまに EXE / DLL が 32bit / 64bit いずれのものなのか調べたい時がありますよね。

# やり方

[dumpbin.exe？](https://docs.microsoft.com/ja-jp/cpp/build/reference/dumpbin-reference?view=vs-2019) Delphi (や C++Builder) をインストールした環境なら、`<インストールフォルダ>\bin` に **TDUMP.EXE** があるので、これを使います。

**See also:**

 - [TDUMP.EXE (DocWiki)](http://docwiki.embarcadero.com/RADStudio/ja/%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB_%E3%83%80%E3%83%B3%E3%83%97_%E3%83%A6%E3%83%BC%E3%83%86%E3%82%A3%E3%83%AA%E3%83%86%E3%82%A3%EF%BC%9A_TDUMP.EXE)

## テスト用の DLL を作る

EXE の 32bit / 64bit は実行してみればタスクマネージャで判るので、今回は DLL でテストします。まずはテスト用の中身のない DLL を作ります。

 1. [新規作成 | その他] で `ダイナミックリンクライブラリ` を選択。<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/2526f9fc-2262-05dc-00d0-ca41a80345f4.png)<br>
 2. [ファイル | プロジェクトに名前を付けて保存] で適当な場所に `TestDLL.dproj` として保存。
 3. プロジェクトマネージャの `ターゲットプラットフォーム` を右クリックして [プラットフォームの追加]。<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/b0f5909d-e9b9-b81e-dda4-0328e4ca250a.png)<br>
 4. `Windows 64ビット` を選択して [OK]。<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/8ecfbbfd-cc2b-4ffc-fefe-f4ff467c20e1.png)<br>
 5. [ビルドグループペインの表示] ボタンを押してビルドグループペインを表示<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/48f5691c-7446-3f3d-3fe3-d7ed37c83b7f.png)<br>
 6.[ビルドグループを新規作成] ボタンを押す。<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/496db8a7-aaa1-fac0-2be6-42390877cec1.png)<br>
 7.名前を `ALL` にする。<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/290c4016-ee25-9c92-8f6a-785e471e1a79.png)<br>
 8.[構成] を `Release` にし、[プラットフォーム] を `Win32;Win64` とする。<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/f9627783-5bfa-14c0-bb18-10395e1d14cd.png)<br>
 9.[現在のビルドグループをビルド] を押す。<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/a6b26ef2-2b41-0f37-2078-67921ff2629d.png)<br>
これで 32bit と 64bit の DLL が一気に生成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/42090440-0b81-c327-6780-858d8ed8eb13.png)

## で、判別方法

```
tdump -e ファイル名
```

とやると、次のような結果が得られます。

```
Old Executable Header

DOS File Size                                     110E00h  (1117696. )
Load Image Size                                      210h  (   528. )
Relocation Table entry count                          0000h  (     0. )
Relocation Table address                              0040h  (    64. )
Size of header record      (in paragraphs)            0004h  (     4. )
Minimum Memory Requirement (in paragraphs)            000Fh  (    15. )
Maximum Memory Requirement (in paragraphs)            FFFFh  ( 65535. )
File load checksum                                    0000h  (     0. )
Overlay Number                                        001Ah  (    26. )

Initial Stack Segment  (SS:SP)                    0000:00B8
Program Entry Point    (CS:IP)                    0000:0000


Portable Executable (PE) File

Header base: 00000100

CPU type                 80386
Flags                    A18E [ executable 32bit library ]
DLL flags                0000 [ ]
Linker Version           2.19
Time stamp               5F6F442B : Sat Sep 26 22:37:47 2020
O/S Version              5.0
User Version             0.0
Subsystem Version        5.0
Subsystem                0002 [ Windows GUI ]
Object count             0000000A
Symbols offset           00000000
Symbols count            00000000
Optional header size     00E0
Magic #                  10B
Code size                000F2C00
Init Data size           0001DE00
Uninit Data size         00000000
Entry RVA                000F48E4
Image base               00400000
Code base                00001000
Data base                000F5000
Object/File align        00001000/00000200
Reserved                 00000000
Image size               0011E000
Header size              00000400
Checksum                 00000000
Stack reserve/commit     00000000/00000000
Heap reserve/commit      00100000/00001000
Number interesting RVAs  00000010

  ...
```

`CPU type` 行が **80386** なら 32bit、**AMD64** なら 64bit DLL です [^1]。

`<インストールフォルダ>\bin` には **GREP.EXE** もあるので、

```
tdump -e ファイル名 | grep "CPU type"
```

とやると、`CPU type` 行だけを抽出できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/80d184b3-f60c-cf33-b4de-ddcb14ae9eb7.png)
EXE / DLL の 32bit / 64bit を調べるだけなら **TDUMP64.EXE** を使っても結果は同じです。

**See also:**

 - [GREP.EXE (DocWiki)](http://docwiki.embarcadero.com/RADStudio/ja/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E6%A4%9C%E7%B4%A2%E3%83%A6%E3%83%BC%E3%83%86%E3%82%A3%E3%83%AA%E3%83%86%E3%82%A3%EF%BC%9A_GREP.EXE)
 - [TDUMP64.EXE (DocWiki)](http://docwiki.embarcadero.com/RADStudio/ja/64_%E3%83%93%E3%83%83%E3%83%88_Windows_%E7%89%88%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB_%E3%83%80%E3%83%B3%E3%83%97_%E3%83%A6%E3%83%BC%E3%83%86%E3%82%A3%E3%83%AA%E3%83%86%E3%82%A3%EF%BC%9A_TDUMP64.EXE)

# おわりに
誰ですか？**「メモ帳に食わせれば...」**とか言うのは！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/7206db4a-af08-e66a-5c6f-de564aaccbe6.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/97ce7d6c-049d-562f-e1ce-2b94abc0c35b.png)

| 名前 | 値 |
|:---|:-:|
| IMAGE_FILE_MACHINE_I386 | 0x014C |
| IMAGE_FILE_MACHINE_AMD64 | 0x8664 |


**See also:**

 - [006_究極の選択 - アセンブリ言語と PE ヘッダ (Mr.XRAY)](http://mrxray.on.coocan.jp/Delphi/plSamples/006_Assembler_exe.htm)
 - [IMAGE_NT_HEADERS32 structure (winnt.h) (docs.microsoft.com)](https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-image_nt_headers32)
 - [IMAGE_FILE_HEADER structure (winnt.h) (docs.microsoft.com)](https://docs.microsoft.com/en-us/windows/win32/api/winnt/ns-winnt-image_file_header)

[^1]: 16bit EXE / DLL だと何も表示されません ("CPU type" 行がありません)。