Delphi で生成された EXE が動作する Windows のバージョン

# はじめに

Delphi で生成された EXE が動作する Windows のバージョンを調べてみました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/91eae65e-f9ec-d494-64c2-8c99a83e2764.png)

調査には Delphi 付属の `TDUMP.EXE` を使用しています。

**See also:**

 - [ファイル ダンプ ユーティリティ： TDUMP.EXE (DocWiki)](https://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)
 - [64 ビット Windows 版ファイル ダンプ ユーティリティ： TDUMP64.EXE (DocWiki)](https://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)
 - [Delphi がインストールされた環境で、EXE / DLL が 32bit / 64bit いずれなのかを判別する (Qiita)](https://qiita.com/ht_deko/items/a36419b949c8b7e76912)

# Delphi で生成された EXE が動作する Windows のバージョン

調査結果です。

| バージョン | O/S Version | Subsystem Version | 
|:---|:---|:---|
| Delphi (16bit) | **3.1** |  | 
| Delphi 2 | **1.0** | **4.0** |
| Delphi 3 | 1.0 | 4.0 |
| Delphi 4 | 1.0 | 4.0 |
| Delphi 5 | 1.0 | 4.0 |
| Delphi 6 | **4.0** | **4.0** |
| Delphi 7 | 4.0 | 4.0 |
| Delphi 2005 | 4.0 | 4.0 |
| Delphi 2006 | 4.0 | 4.0 |
| Delphi 2007 | 4.0 | 4.0 |
| Delphi 2009 | **5.0** | **5.0** |
| Delphi 2010 | 5.0 | 5.0 |
| Delphi XE | 5.0 | 5.0 |
| Delphi XE2 | 5.0 | 5.0 |
| Delphi XE3 | 5.0 | 5.0 |
| Delphi XE4 | 5.0 | 5.0 |
| Delphi XE5 | 5.0 | 5.0 |
| Delphi XE6 | 5.0 | 5.0 |
| Delphi XE7 | 5.0 | 5.0 |
| Delphi XE8 | 5.0 | 5.0 |
| Delphi 10 Seattle| 5.0 | 5.0 |
| Delphi 10.1 Berlin | 5.0 | 5.0 |
| Delphi 10.2 Tokyo | 5.0 | 5.0 |
| Delphi 10.3 Rio | 5.0 | 5.0 |
| Delphi 10.4 Sydney | 5.0 | 5.0 |
| Delphi 11 Alexandria | **6.0** | **6.0** |
| Delphi 12 Athens | 6.0 | 6.0 |

PE ヘッダーからみたマイルストーンは

 - **Delphi** - Windows 3.1 で動作
 - **Delphi 5** - Win32s でも動作するかもしれない最終版 (まず動かないと思う)
 - **Delphi 2007** - Win9x 系で動作するかもしれない最終版
 - **Delphi 10.4 Sydney** - Windows 2000 / XP で動作するかもしれない最終版

のようです。

**See also:**

 - [オペレーティング システムのバージョン (Microsoft Docs)](https://docs.microsoft.com/ja-jp/windows/win32/sysinfo/operating-system-version?redirectedfrom=MSDN)


# ターゲットプラットフォームとしての Windows をサポートする Delphi のバージョン
ターゲット Windows のバージョンと Delphi の関係です。言い換えれば、Delphi でコンパイルしたプログラムの動作が保証されている Windows のバージョンです。

| Windows | サポート開始 | サポート終了 |
|:---|:---|:---|
| Windows 11 | Delphi 11.0 Alexandria |  |
| Windows 10 | Delphi XE8 |  |
| Windows 8 / 8.1 | Delphi XE3 |  |
| Windows 7 | Delphi 2010 |  |
| Windows Vista | Delphi 2007 | Delphi XE6 |
| Windows XP | Delphi 7 | Delphi XE2 |
| Windows 2000 | Delphi 6 | Delphi 2009 |
| Windows Me | Delphi 6 | Delphi 6 [^1] |
| Windows 98 / 98 SE | Delphi 4 | Delphi 7 |
| Windows NT 4.0 | Delphi 3 | Delphi 6 |
| Windows 95 | Delphi 2 | Delphi 5 |
| Windows NT 3.51 | Delphi 2 | Delphi 3 |
| Windows 3.1 | Delphi 1 | Delphi 1 [^2] |

::: note info
公式のドキュメントも途中までは `"開発プラットフォーム (IDE の動作環境) ＝ターゲットプラットフォーム"` だったため、独自調べです。ターゲットプラットフォームが明示されるようになったのは 10.1 Berlin 以降です。
:::

**See also:**

 - [サポートされているターゲットプラットフォーム (DocWiki)](https://docwiki.embarcadero.com/RADStudio/ja/%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%82%8B%E3%82%BF%E3%83%BC%E3%82%B2%E3%83%83%E3%83%88_%E3%83%97%E3%83%A9%E3%83%83%E3%83%88%E3%83%95%E3%82%A9%E3%83%BC%E3%83%A0)
 - [RAD Studio、C++ Builder、Delphi サポート OS (Support Wiki)](https://docwiki.embarcadero.com/Support/ja/RAD_Studio%E3%80%81C%2B%2BBuilder%E3%80%81Delphi%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88OS)
 - [旧バージョン動作環境 - Delphi (EDN)](https://support.embarcadero.com/article/37647)
 - [旧バージョン動作環境 - C++Builder (EDN)](https://support.embarcadero.com/article/37657)
 - [Delphi 2 ～ 3.1 は 32bit アプリケーションだけどインストーラが 16bit アプリケーションなせいで 64bit Windows へインストールできない件をどうにかする (Qiita)](https://qiita.com/ht_deko/items/ca2d174c14542646f46d)

# おわりに

**Delphi 11 Alexandria** でコンパイルしたプログラムを Windows XP で動作させようとするとエラーになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/8fb6c28f-fe35-f4f7-9f6a-b8a64bfa21ea.png)

::: note warn
11.0 Alexandria 以降で吐かれた EXE は基本的に Windows XP 以前で動作しません。
:::

## ・PE ヘッダーフラグの変更

**PE ヘッダーフラグ**を変更すれば Windows XP で動作しない事もありません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/7b910d45-8462-ff68-9c9f-5b86f760b6d9.png)

以前作った **「メモ帳クローン」** のプロジェクトファイルを 11.0 Alexandria で開き、PE ヘッダフラグを `5.0` に設定してビルドしてみましたが、一通り普通に動作しました [^3]。

```pascal:notepad_clone.dpr
program notepad_clone;

{$SETPEOSVERSION 5.0}     // 5.0 に変更
{$SETPESUBSYSVERSION 5.0} // 5.0 に変更

uses
  Vcl.Forms,
  frmuMain in 'frmuMain.pas' {Form1},
  frmuGotoLine in 'frmuGotoLine.pas' {Form2},
  frmuHeaderFooter in 'frmuHeaderFooter.pas' {Form3},
  Vcl.Themes,
  Vcl.Styles;

{$R *.res}

begin
  ReportMemoryLeaksOnShutdown := True;
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.Title := 'メモ帳クローン';
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.
```

プロジェクトオプションのリンカオプションを変更しても同じ効果が得られます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/28844a95-fa9a-5fc5-ef46-4e0c66fe7de4.png)

## ・~~GetTickCount64 対策~~

~~**TThreadPool** を使っていると変な動作になるかもしれません。内部で `TThread.GetTickCount64` が使われており、このせいで XP では外部例外が発生します。~~

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/21785/7515e39c-581a-d0da-9909-51cf61e6a675.png)

~~`TThread.GetTickCount64` そのものは Delphi 11 Alexandria で実装されたため、過去のバージョンのコードでスレッドが使われていても多くの場合で問題になる事はないと思われますが、`System.Threading.TThreadPool` では内部で `TThread.GetTickCount64` が使われるようになっています。~~

~~この問題を回避するには `$(BDS)\source\rtl\common` にある `System.Threading.pas` を改変して使うといいようです。~~

~~`System.Classes.TMultiWaitEventImpl` にもクラスメソッドとして `GetTickCount64` があるのですが、こちらは Delphi 11 Alexandria になって実装されているため (過去のバージョンでは `GetTickCount` が実装されている)、問題になる事はまずないと思います。~~

:::note warn
XP で動作するバイナリは 10.4 Sydney 以前で作るのが無難かと思います。
:::

:::note info
この件は 11.0 Alexandria Patch 1 において修正されました。
:::

**See also:**

 - [PE（portable executable）ヘッダー フラグ（Delphi） (DocWiki)](https://docwiki.embarcadero.com/RADStudio/ja/PE%EF%BC%88portable_executable%EF%BC%89%E3%83%98%E3%83%83%E3%83%80%E3%83%BC_%E3%83%95%E3%83%A9%E3%82%B0%EF%BC%88Delphi%EF%BC%89)
 - [SETPEOSVERSION (DocWiki)](https://docwiki.embarcadero.com/RADStudio/ja/SETPEOSVERSION)
 - [SETPESUBSYSVERSION (DocWiki)](https://docwiki.embarcadero.com/RADStudio/ja/SETPESUBSYSVERSION)
 - [［リンク］(DocWiki)](https://docwiki.embarcadero.com/RADStudio/ja/%EF%BC%BB%E3%83%AA%E3%83%B3%E3%82%AF%EF%BC%BD)
 - [Delphi 11 Windows XP compatibility tweak (Delphi-PRAXiS)](https://en.delphipraxis.net/topic/5536-delphi-11-windows-xp-compatibility-tweak/)
 - [Delphi Starter Edition でメモ帳クローンを作る (前編) (Qiita)](https://qiita.com/ht_deko/items/bd854e8a22cf31b636b0)
 - [RAD Studio 11 Alexandria Patch 1 Available (Embarcadero)](https://blogs.embarcadero.com/rad-studio-11-alexandria-patch-1-available/)

[^1]: Delphi 7 が Windows Me に対応していないのは単なる記載漏れのような気も。
[^2]: Delphi 2 ～ 4 の CD-ROM には Delphi 1 のインストーラが含まれています。
[^3]: アイコンがちゃんと 11.0 Alexandria のものになっています。