Windows 秘話共有するときは公正に

Raymond Chen

これまで、 プログラムをアンインストールするときに、"このファイルを削除すると、他のアプリケーションを適切に実行できなくなる可能性がありますが、よろしいですか" と Windows® が確認するのはなぜか、疑問に思ったことはありませんか。まず、このメッセージ (スクリーンショットを参照) は、Windows からではなく、アンインストーラから出力されます。したがって、正しい疑問は "アプリケーションのアンインストーラは、なぜこのダイアログ ボックスを表示するのだろうか" ということになります。これは、答えられない質問をユーザーに投げかけているよい例です。では、このような悲しい状況に至った経緯をご説明しましょう。

インストーラは、複数のアプリケーションによって使用されるファイル (関連性のない複数のプログラムによって使用される MFC ランタイム ライブラリなど) の参照カウントを管理するために、あるエントリを SharedDLLs レジストリ キーの下に作成します。このエントリは、ファイルとその参照カウントの一覧を保持します。既にファイルのエントリが存在する場合は、そのファイルの参照カウントを 1 増加します。エントリが存在しない場合は、そのファイルの参照カウントを 1 に設定します。逆に、プログラムがアンインストールされるときに、参照カウントを 1 減少し、カウントが 0 になると、このファイルを使用するプログラムがなくなるので、ファイルを削除します。少なくとも、理論上はそうでした。

Should I delete it or not?

Should I delete it or not?  (画像を拡大するには、ここをクリックします)

このモデルには、すべてのプログラムが規則に従って動作することを前提としているという重要な問題点があります。ただし、ごまかしたとしても通常はそのプログラムが罰せられることはないので、ついごまかしてしまいたい誘惑に駆られます。

たとえば、MFC ランタイム ライブラリを使用するプログラムがあり、そのインストーラは参照カウントを更新せずに、単純にライブラリをシステムに直接コピーするとします。その後、このプログラムをアンインストールすると、単純にそのランタイム ライブラリも削除されます。では、このプログラムが、規則に従っている別のプログラムと共存しようとすると、どのような動作が発生するか考えてみましょう。基本的なイベントの流れは、次のようになります。

  1. 良いプログラムをインストールします。ライブラリがインストールされ、参照カウントが 1 に設定されます。
  2. 悪いプログラムをインストールします。ライブラリがインストールされますが、参照カウントは変更されません。
  3. 悪いプログラムをアンインストールします。ライブラリが削除されます。

この一連のイベントの結果、ライブラリが削除されるので、良いプログラムが機能しなくなります。

別のシナリオを次に示します。

  1. 良いプログラムをインストールします。ライブラリがインストールされ、参照カウントが 1 に設定されます。
  2. 悪いプログラムをインストールします。ライブラリがインストールされますが、参照カウントは変更されません。
  3. 良いプログラムをアンインストールします。参照カウントが 0 になり、ライブラリが削除されます。

このシナリオの結果、悪いプログラムが機能しなくなります。

良いプログラムの開発者は、「悪いプログラムが良いプログラムを停止するのは止められないけれど、少なくとも良いプログラムは悪いプログラムを停止しないようにしよう」と考えました。したがって、良いプログラムがファイルを削除しようとすると、一度処理が停止し、"このファイルを削除しますが、問題ないでしょうか。悪いプログラムがインストールされていて、このファイルを使用している場合、悪いプログラムは停止します。悪いプログラムがインストールされている場合は、[削除しない] をクリックしてください" という警告メッセージが表示されます。そうですね。これは正確な言い回しではありませんが、どのダイアログ ボックスについて話をしているかおわかりでしょう。あの Jeffrey Richter でさえ、1996 年発行の『Microsoft Systems Journal』の記事で、この方法を推奨しています。

残念ながら、このような操作を実行すると、適切に答えられない質問がユーザーに表示されます。

もちろん、どんなファイルが上書きされる場合でも Windows に確認を要求するような、何でも管理したがる人であれば、このダイアログ ボックスを称賛するでしょう。世の中のアンインストーラ プログラムでは、アンインストール プロセスをファイル単位で制御できる機能が提供されています。ただし、設定には十分注意してください。実際に設定どおりになって、困ることもありますから。

Raymond Chen は自分の Web サイト「The Old New Thing」および同じタイトルの書籍で、Windows の歴史と Win32 プログラミングについて扱っています。関心があるのは、自分が生きているうちに核融合が可能になるかどうかということです。

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