Windows 秘話DLL Hell からの脱却

Raymond Chen

DLL HELL 問題が知らない間に進行するため、このような軽蔑的なニックネームが付いています。あるプログラムをインストールしたら、突然、関係がないと思われるプログラムが停止することがあります。これは、知らない間に、共有 DLL ファイルで 2 つのプログラムが関連付けられているからです。システム ディレクトリに必要な MSVCRT.DLL ファイルについて、2 つのプログラムで想定されているバージョンが異なる可能性があります。つまり、1 つ目のプログラムが ActiveX® コントロールをアップグレードした場合、同じコントロールを使用する 2 つ目のプログラムがそのアップグレードされたコントロールとまったく互換性がないかもしれません。

両方のプログラムが会社の日常業務に不可欠である場合は、どちらのプログラムに原因があるかは問題ではありません。重要なのは、2 つのプログラムを開始して実行する必要があるということです。"損をする" と "誰かのせいで損をする" に大きな違いはありません。どちらにしても、あなたの会社は損をしており、問題をすぐに解決するのがあなたの仕事です。

以前は、どちらのプログラムを優先させるかを選択する必要がありました。Windows® 2000 から、このような競合の解決策が利用できるようになりました。しかし、これらはシステムを立て直すことのできる一時的な解決策にすぎず、競合を完全に解決できる方法を調べる必要があります。

Windows 2000 では、現在ダイナミックリンク ライブラリ リダイレクトという名前で知られている機能の基本バージョンが実装されました。DLL リダイレクトを有効にするには、リダイレクトする DLL を持つプログラムと同じ名前のファイルを作成し、そのファイル名の最後に .local を付けます。たとえば、リダイレクトを C:\Program Files\Litware Inc\Invoice.exe に適用するには、C:\Program Files\Litware Inc\Invoice.exe.local というファイルを作成します。ファイルの内容は重要ではありません。重要なのはファイルの存在です。

プログラムのリダイレクトを有効にすると、そのプログラムが DLL を読み込もうとするたびに、まずプログラムが格納されているディレクトリ、次に通常の検索場所、の順に検索が行われます。したがって、MSVCRT.DLL ファイルが競合する場合は、各プログラムのリダイレクトを有効にして、MSVCRT.DLL の個人用コピーを各プログラムのインストール ディレクトリに格納します。各プログラムは、独自のバージョンの MSVCRT.DLL、つまりプログラムのテストに使用された バージョンの DLL を受け取ります。

この手法の不思議なところは、プログラムが完全なパスを使用して DLL を読み込む場合でも機能するということです。たとえば、プログラムが C:\Program Files\Common Files\Proseware Inc\taxplugin.dll を読み込もうとしているとします。Proseware 2.0 にアップグレードした後で、あなたはその tax プラグインが invoice プログラムと互換性がないことに気付きます。そこで、tax プラグインの古いバージョンを C:\Program Files\Litware Inc\taxplugin.dll にコピーします。プログラムが完全なパスを使用して tax プラグインを読み込んでも、DLL リダイレクトによって現在のディレクトリが検索され、Proseware Inc ディレクトリのプラグインの代わりにローカルのプラグインが優先的に使用されます。

Windows XP と Windows Vista™ では、DLL リダイレクトのルールが少し異なりますが、一般原則は同じです。.local ファイルの他に、.local ディレクトリも作成できます。その場合は、プログラムのインストール ディレクトリではなく .local ディレクトリが検索されます。これにより、リダイレクトを同じディレクトリ内の複数のプログラムに、競合することなく適用できます。

アプリケーション マニフェストを含むプログラムにはリダイレクトを適用できません。いわゆる既知の DLL もリダイレクトできません。詳細については、「Dynamic-Link Library Redirection」 (英語) を参照してください。

DLL リダイレクトを使用しても、DLL Hell から完全に抜け出すことはできません。しかし、問題を解決しながら、少なくともその傷口を応急的に処置することはできます。

図 1

図 1   

Raymond Chen彼の Web サイト「The Old New Thing」 (英語) および彼の最新の著書『The Old New Thing』 (英語)(Addison-Wesley、2006 年) で、Windows の歴史と Win32 プログラミングについて執筆しています。ただし、彼が The Old New Thing という名前の猫を飼っているわけではありません。

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