Windows 秘話時代遅れの 16 ビット アイコン

Raymond Chen

2008 年 2 月 の「Windows 秘話」コラムでご説明したように、Windows® では廃止される機能があります。機能の廃止は徐々に行われ、多くの場合いつの間にか行われています。ですが、製品チームでは、機能の廃止が決定するたびに、そのことを控えめに公表しています。32 ビット コードから 16 ビット モジュール (多くの場合は、16 ビットの EXE や DLL) に格納されているアイコンへのアクセスは、Windows Vista® で廃止された機能の一例です。

皆さんが心配しないようにお知らせしておきますが、16 ビット コードからは 16 ビット モジュールに格納されているアイコンに問題なくアクセスできます。この処理は、16 ビットのエミュレーション層で行われます。Windows Vista で廃止されたのは、32 ビット コードから 16 ビット モジュールに格納されているアイコンにアクセスする機能です。もっと具体的に説明すると、ExtractIcon 関数など、32 ビットの抽出関数で 16 ビット DLL に格納されている 16 ビット アイコンを読み込むことができなくなりました。

16 ビット モジュールに格納されているアイコンを抽出する 32 ビット コードでは、ファイル内のアイコンを特定する際に FindResouce 関数などのカーネル関数を使用することができません。このような 32 ビット コードでは、独自のミニローダーを実装する必要があり、それを使用して、16 ビット モジュールのヘッダーを解析し、リソース テーブルを検出し、リソース テーブルを解析して、必要なアイコン リソースを検出する必要があります。この一連の処理を行わなければ、32 ビット コードではピクセルをアイコンに変換できません。

  (画像を拡大するには、ここをクリックします)

ご想像のとおり、このような処理を行うコードは非常に旧式で脆弱です。バイナリ データは手違いまたは故意により破損していることがあり、バイナリ データの解析中にエラーが発生する可能性は十二分にあります。ファイルを開いたり、共有したりする方法が統一されていないと、ネットワークのキャッシュ機能にさまざまな影響を及ぼすので、ネットワーク パフォーマンスを向上するために、パフォーマンス チームから、ファイルを開く方法を変えるようにという要請があるでしょう。また信頼性チームからは、メモリ マップ ファイルを使用しないように、解析コードを書き直すようにという要請があるでしょう。このようなコードの保守にかかるコストが、コードの価値に見合わなくなるのは時間の問題です。と言うのも、今後、16 ビット プログラムを記述する人はいないからです。

16 ビットのエミュレーション層が存在する限り 16 ビット プログラムを実行することは可能です (64 ビット版の Windows Vista では 16 ビットのエミュレーション層はありませんが、これは Windows XP から後退したわけではなく、64 ビット版の Windows XP でも 16 ビットのエミュレーション層はありませんでした。この点に関しては Windows Vista では現状維持ということになります)。

Windows Vista で利用できなくなった機能は、32 ビット プログラムで ExtractIcon 関数を実行して、16 ビット DLL からアイコンを取得することだけです。[スタート] メニューに 16 ビット プログラムへのショートカットがある場合、エクスプローラでは、16 ビット プログラムのメイン .exe からアイコンを抽出できないので、そのショートカットのアイコンには、汎用的なプログラム アイコンが表示されます。これは、それほど大きな損失ではありませんが、この動作が問題になる場合は、当該ショートカットのプロパティを編集して、32 ビット モジュールのアイコンを指定できます。

この動作が問題になっているのを見たことは一度しかありません。それは、あるアイコン編集ツールを使用して作成したアイコン ライブラリです。どういうわけか、このプログラムでは、アイコンをリソースとして保存するとデフォルトで 16 ビットの DLL に格納されました。そのため、このプログラムで作成したアイコンには 32 ビット コードからアクセスできません。言うまでもないことですが、この問題の簡単な回避策は、アイコン ライブラリを 32 ビット DLL にリソースとして保存し直すことです。

今はなくても、今後、だれかが 16 ビット DLL のアイコンをすべて抽出し、そのアイコンを含む 32 ビット リソースのみで構成された DLL を作成する小さなプログラムを作成するのは間違いないと思います。このようなプログラムがあれば、16 ビット DLL に格納されている古いアイコンを [スタート] メニューのショートカットで使用できるようになります。しかし、正直なところ、このようなプログラムを記述しても、それを実際に必要とする人はおそらく存在しないでしょう。というのも、Windows ユーザー インターフェイス チームには、このようなプログラムを切望するユーザーからの声は 1 件も寄せられていませんから。

Raymond Chen は自分の Web サイト「The Old New Thing」および同じタイトルの書籍で、Windows の歴史と Win32 プログラミングについて扱っています。彼は扉から離れて立つことを心がけています。

© 2008 Microsoft Corporation and CMP Media, LLC. All rights reserved; 許可なしに一部または全体を複製することは禁止されています.