Windows 11 でそのまま動く最古の GUI アプリは、1992 年の CD プレーヤーだった
まず 1993 年の FreeCell を Windows 11 で動かし、Internet Archive で NT 3.1 のプレリリース版を漁る。行き着いたのは 1992 年 11 月の CDPLAYER.EXE。呼び出し規約の修正後で、今も残る crtdll.dll を使って壊れた C ランタイムを避けていた。
日本語
コピー

初期調査
以前から、ちょっとした疑問を抱えていた。変更もエミュレーションもなしに Windows 11 で今も動く GUI アプリケーションの中で、最も古いものは何か、というものだ。
Windows の後方互換性は優秀なので、答えは驚くほど古いものになるだろうと予想していた。
残念ながら、Windows 11 は 16 ビットの Windows プログラムを単体では実行できない。64 ビット版 Windows には NTVDM がないからだ。となると、NT 時代の初期のものから探すしかない。
この疑問は以前、匿名掲示板で投げたことがある。Win32s を教えてくれた人がいて、FREECELL.exe が付いた初期リリース版を探すよう勧められた。
そのとおりにしてみると、案の定、更新日時が 22-Feb-93 の FREECELL.EXE が、最新の Windows 11 上で一切変更を加えずに動作し、問題なく遊べた。

この記事を書いている時点で、33 年 8 か月前のアプリケーションということになる。驚いたことに、ほぼ自分の年齢と同じだ。
「へえ」と思った程度で、これで謎は解けたと結論づけ、しばらくすると忘れてしまった。ところが最近になって、なぜかこの疑問がまた頭に浮かび、今度はもっと古いものがないか本気で調べてみることにした。
さらなる調査
Internet Archive で古い Windows のバージョンを漁っていると、NT 3.1 の初期プレリリース版がいくつか見つかり、期待が持てた。だが問題は、現在の実行ファイル形式との非互換か、開発の後半で変更された API のどちらかにあった。
1991 年の最も初期のバージョンは、現代の Windows と互換性のない草案段階の PE 形式を使っていた。1992 年半ばまでのビルドは、Windows API 呼び出しに stdcall ではなく cdecl 呼び出し規約を前提としていたため、引数が二重に削除されてしまう。こんな具合だ。
push hwnd ; 4 bytes of args
call [ShowWindow] ; Win11 ShowWindow is stdcall, ends with "ret 4" and removes them
add esp, 4 ; the 1992 caller removes them again
当然ながら、これではプログラムはクラッシュする。
しかし、Build 347 に目を引くアプリケーションが 1 つあった。16-Nov-1992 でリンクされていた CDPLAYER.EXE だ。この時点で呼び出し規約は修正済みだったが、同じビルドの他のプログラムは同梱の C ランタイムでクラッシュする。CDPLAYER.EXE はシステムの crtdll.dll を使うことでそれを回避しており、Windows 11 には今も SysWOW64 に crtdll.dll が同梱されている。
プログラムを起動すると、こんな表示が出る:

当然だが、私のマシンに CD-ROM ドライブは付いていない。だが、小さな DLL(cdemu.dll)を使えば、偽の音声データでドライブをエミュレートし、実際に音を鳴らせる:

もうすぐ 34 年になるプログラムとしては、なかなかすごい。
ズルをしたら?
先ほど、16 ビットプログラムはサポートが終わったので対象外だと書いた。
だが、望むなら otvdm のようなものを使って、古い Windows アプリを動かすこともできる。
見てほしい。Windows 1.01 から取り出した REVERSI.EXE(15-Nov-1985 付き)が、Windows 11 上で完全に遊べる状態で動いている:

otvdm を使うのはズルのようにも感じるが、この記事に入れる価値はあると思った。