# Delphi がインストールされた環境で、EXE / DLL が 32bit / 64bit いずれなのかを判別する --- tags: Delphi programming RadStudio C++builder embarcadero created_at: 2020-09-27 updated_at: 2020-09-30 --- # はじめに たまに 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. [新規作成 | その他] で `ダイナミックリンクライブラリ` を選択。
![image.png](./images/2526f9fc-2262-05dc-00d0-ca41a80345f4.png)
2. [ファイル | プロジェクトに名前を付けて保存] で適当な場所に `TestDLL.dproj` として保存。 3. プロジェクトマネージャの `ターゲットプラットフォーム` を右クリックして [プラットフォームの追加]。
![image.png](./images/b0f5909d-e9b9-b81e-dda4-0328e4ca250a.png)
4. `Windows 64ビット` を選択して [OK]。
![image.png](./images/8ecfbbfd-cc2b-4ffc-fefe-f4ff467c20e1.png)
5. [ビルドグループペインの表示] ボタンを押してビルドグループペインを表示
![image.png](./images/48f5691c-7446-3f3d-3fe3-d7ed37c83b7f.png)
6.[ビルドグループを新規作成] ボタンを押す。
![image.png](./images/496db8a7-aaa1-fac0-2be6-42390877cec1.png)
7.名前を `ALL` にする。
![image.png](./images/290c4016-ee25-9c92-8f6a-785e471e1a79.png)
8.[構成] を `Release` にし、[プラットフォーム] を `Win32;Win64` とする。
![image.png](./images/f9627783-5bfa-14c0-bb18-10395e1d14cd.png)
9.[現在のビルドグループをビルド] を押す。
![image.png](./images/a6b26ef2-2b41-0f37-2078-67921ff2629d.png)
これで 32bit と 64bit の DLL が一気に生成されます。 ![image.png](./images/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](./images/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](./images/7206db4a-af08-e66a-5c6f-de564aaccbe6.png) ![image.png](./images/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" 行がありません)。