64bitアプリケーションでは大量のメモリを扱えるが、DOSやWin16のアプリケーションは実行できないし、32bit DLLも呼び出せない。そしてIEが2種類ある理由とは?
前回は、64bit版Windows OS上でWin32アプリケーションを実行するWOW64について解説した。今回は、64bit版Windows OSで実行可能なプログラムの種類と互換性に関する話題について取り上げる。
WOW64のメカニズムを使えば、64bit Windows OS上でもWin32アプリケーションを実行できるが、これだけでは従来の32bit Windows OSと完全に互換性を持たせることはできない。32bitのWindows OS上で実行できるプログラムはWin32プログラム(Win32 APIを呼び出す、32bitコードを使ったプログラム)だけではないからだ。32bit Windows OSでは、古い16bit Windowsアプリケーションや、さらに前のDOSプログラムなども実行できるようになっている。
種類 | 32bit Windows OS | 64bit Windows OS |
---|---|---|
16bit DOSプログラム(*.com、*.exe) | ○(NTVDM) | × |
Win16プログラム(*.exe) | ○(WOW32) | × |
Win32プログラム(*.exe) | ○(ネイティブAPI) | ○(WOW64) |
Win64プログラム(*.exe) | × | ○(ネイティブAPI) |
※Win64からの32bit DLL呼び出し(混在) | − | × |
実行可能なプログラムの種類 DOS時代のプログラムは.comファイルに格納されているものもあったが、それ以後のプログラムはすべて.exeファイルに格納されている。.exeファイルにはいくつかバージョンがあり、Win32以降ではx86以外のコードも格納できる、COFF/PE(コモン・オブジェクト・ファイル・フォーマット/ポータブル実行ファイル)形式となっている。 NTVDMはDOSプログラムを実行するための仮想マシン環境。WOW32は、Win32上でWin16アプリケーションを実行させるための仕組み。 |
以下、それぞれの例について、具体的に見ていこう。
DOSプログラムとは、Windows OS以前から存在している、MS-DOSやPC-DOSの時代のプログラムのことである。16bitのx86命令コードで記述されており、通常は.comや.exeといった拡張子を持つファイルに格納されている。32bit Windows上では、DOSプログラムはNTVDMという仮想DOSマシン(x86 CPUの持つ仮想8086モードという、古い16bitコード向けの動作モードを使用)の上で実行されるようになっている。
64bit版WindowsではこのNTVDMはサポートされていないので、DOSプログラムは実行できない(64bit OSの時代に、16bitのDOSコードをサポートする積極的な理由がないし、Itaniumのような非x64アーキテクチャでは仮想DOSマシン環境の再現が困難だからだろう)。この結果、16bitのコードを実行しようとしても、次のWin16の場合と同様にエラーとなる。
Win16プログラムとは、16bitのWindows OS時代(Windows Ver.1.x〜3.xの頃)のプログラムである。32bit Windows上では、WOW32というメカニズムを使って、Win16の16bit APIをWin32 APIに変換しながら実行している(64bit Windows上のWOW64と同じような仕組み)。CPUの動作モードでいえば、Win16のプログラムは16bitのプロテクト・モードで実行し、ネイティブのWin32 APIは32bitのプロテクト・モードで動作している。
だが前回述べたように、API呼び出しで使われるハンドルなどの情報を16bit幅に丸めて処理する適切な方法がないなどの理由により、Win16アプリケーションも64bit Windowsではサポートされていない。10年以上も前のWindows 95の登場以後、ほとんどのアプリケーションがすでに32bit化(Win32対応)され、大容量メモリをサポートする64bit Windows OSではWin16アプリケーションをサポートする必要性もそう高くない。どうしても必要なら、32bit版Windowsを利用するという方法で対応すれば十分だろう。
64bit版Windows上でDOSプログラムやWin16プログラムを実行しようとすると、次のようなダイアログが表示され、起動できない。
Win16アプリケーションをいまさら新しくインストールする機会はもうほとんどないだろうが、ユーザーが知らないうちに16bitコードがプログラムに含まれていることがある。アプリケーションのインストーラである。アプリケーション本体は32bit化しているものの、古い16bitバージョンのインストーラを使って開発されたプログラムが多数リリースされているのだ(アプリケーションのバージョンが上がっても、インストーラに必要な機能は変わらないため、以前のバージョンをそのまま使い続けていることが多い)。そのため、プログラム自体はWin32だがインストーラがWin16なのでインストールできないというケースが考えられる。
こういう場合は、例えば32bit版のWindows OSを用意してそこへいったんインストールし、その結果のファイルやレジストリ設定などを64bit版のWindowsへコピーするという方法がある。非常に面倒だが、どうしても64bit版Windows上で利用したい場合はこのような方法もある。
ところでこのインストールにまつわるトラブルは多数発生することが予想されるためか、ある特定のバージョンの16bit版インストーラに関しては、64bit Windows OSでは特別扱いをしている。具体的には次の製品/バージョンのインストーラ・プログラムが対象となる。
これらのプログラムが起動されようとすると64bit Windows OSはそれを検出し、該当するWin32版のインストール・プログラムを代わりに起動する。パラメータはそのまま渡されるので、64bit Windows環境でも、少なくともインストール処理は正常に完了する(可能性が高い)。
Copyright© Digital Advantage Corp. All Rights Reserved.