連載
» 2010年07月29日 00時00分 公開

64bit Windows時代到来:第3回 アプリケーションの互換性 (1/3)

64bitアプリケーションでは大量のメモリを扱えるが、DOSやWin16のアプリケーションは実行できないし、32bit DLLも呼び出せない。そしてIEが2種類ある理由とは?

[打越浩幸,デジタルアドバンテージ]
64bit Windows時代到来
Windows Server Insider


「64bit Windows時代到来」のインデックス

連載目次


 前回は、64bit版Windows OS上でWin32アプリケーションを実行するWOW64について解説した。今回は、64bit版Windows OSで実行可能なプログラムの種類と互換性に関する話題について取り上げる。

64bit版Windows環境では実行できないプログラム

 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プログラムを起動する場合

 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プログラムを起動する場合

 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アプリケーションの起動例
これは64bit版のWindows 7上で、Windows 3.1のメモ帳を起動しようとしたところ。Win16アプリケーションはまったく実行できない。DOSプログラムでも同じメッセージが表示される。
 (1)Windows 3.1に付属していた16bit版のメモ帳。
 (2)16bitアプリケーションであることを検出すると、このようなメッセージが表示され、実行できない。

 Win16アプリケーションをいまさら新しくインストールする機会はもうほとんどないだろうが、ユーザーが知らないうちに16bitコードがプログラムに含まれていることがある。アプリケーションのインストーラである。アプリケーション本体は32bit化しているものの、古い16bitバージョンのインストーラを使って開発されたプログラムが多数リリースされているのだ(アプリケーションのバージョンが上がっても、インストーラに必要な機能は変わらないため、以前のバージョンをそのまま使い続けていることが多い)。そのため、プログラム自体はWin32だがインストーラがWin16なのでインストールできないというケースが考えられる。

あるインストーラにおけるエラーの例
これはあるプログラムのインストーラがWin16のためにエラーとなった場合の例。
 (1)このプログラムは、セットアップ・ファイルを%TMP%フォルダに展開後、そこにあるsetup.exeプログラムを起動している。展開する前のプログラム(自己解凍形式の.exeファイル)はWin32のため正常に実行できたが、setup.exeがWin16のため、インストールの途中でこのようなエラーになってしまった。途中までインストールが進むので、事情が分からないと混乱するだろう。

 こういう場合は、例えば32bit版のWindows OSを用意してそこへいったんインストールし、その結果のファイルやレジストリ設定などを64bit版のWindowsへコピーするという方法がある。非常に面倒だが、どうしても64bit版Windows上で利用したい場合はこのような方法もある。

■特別扱いされるインストーラ・バージョン

 ところでこのインストールにまつわるトラブルは多数発生することが予想されるためか、ある特定のバージョンの16bit版インストーラに関しては、64bit Windows OSでは特別扱いをしている。具体的には次の製品/バージョンのインストーラ・プログラムが対象となる。

  • 16bit版のMicrosoft ACME Setup Ver.2.6、3.0、3.01、3.1
  • 16bit版のInstallShield Ver.5.x

 これらのプログラムが起動されようとすると64bit Windows OSはそれを検出し、該当するWin32版のインストール・プログラムを代わりに起動する。パラメータはそのまま渡されるので、64bit Windows環境でも、少なくともインストール処理は正常に完了する(可能性が高い)。


       1|2|3 次のページへ

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。