2

IIS7 で WCF Web サービスとして実行されるアプリケーションがあります。COM コントロールを呼び出し、このコントロールがデータを含む別の dll をロードします。このアプリケーションはかなり長い間使用されており、通常は正常に動作しますが、最近、あるマシンでデータ dll をロードする LoadLibrary 呼び出しが失敗するという問題に遭遇しました。ただし、呼び出しは常に失敗するとは限りません。IIS サービスが再起動された後の最初の呼び出しでは機能し、その後は失敗します。

データ dll は COM コントロールと同じディレクトリに存在し、カレント ディレクトリはこのディレクトリに設定されます。確認したところ、現在のディレクトリが別のディレクトリに設定されていません。両方の呼び出しで同じままです。個別の呼び出しは Web サービスへの個別の呼び出しであり、その間に com コントロールがアンロードされ、データ dll もアンロードされます。

データ dll は、システム ディレクトリに配置するか、com ディレクトリ内の dll へのフル パスを使用すると正常に読み込まれるため、これを回避できますが、なぜそうなるのか疑問に思っています。モジュールのロードに失敗した後に GetLastError を呼び出すと、前述のように、「指定されたモジュールが見つかりませんでした」というエラーが表示されます。

LoadLIBraryのMSDN の説明によると、現在のディレクトリを検索する必要があり、これが機能している他のすべてのインストールでは、通常は検索が行われているようです。失敗しているマシンは Windows Server 2008 R2 マシンですが、アプリケーションはこのタイプのマシンで何度も実行されています。

どんなアイデアでも大歓迎です。LoadLibrary が探している場所を列挙する方法はありますか?

ありがとう、
ジョーダン

4

1 に答える 1

2

すべての DLL 検索パスを列挙する関数が見つかりませんでした。かなり複雑に見えます: http://msdn.microsoft.com/en-us/library/windows/desktop/ms682586%28v=vs.85% 29.aspx

(.exe の場所に加えて) ライブラリの現在の作業ディレクトリを検索する Windows の動作は、潜在的なセキュリティ上の欠陥と見なされます。この記事では、SetDllDirectory 関数など、プロセス内の現在のディレクトリを除外するいくつかの方法について説明しています。IIS がどのように機能するかはわかりませんが、プロセスを制御しないと、他の誰かが検索設定を改ざんしている可能性がありますか? GetDllDirectory が変更されたかどうかを教えてくれると思います。

作業ディレクトリの検索を無効にするグローバル レジストリ設定もありますが、ロードが常に失敗するわけではないため、それが原因ではないと推測する必要があります。

于 2012-04-21T02:06:04.563 に答える