0

残念ながら、これはかなり自由形式の質問になりますが、私は気が遠くなり、アドバイスを求めたいと思いました。

これは、Visual Studio2008SP1を使用するVisualC++MFCアプリです。

同僚と私は両方ともOffice2007をインストールしていましたが、それ以来、アプリで奇妙なDLLの読み込みの問題が発生しました。具体的には、LoadLibraryはDLLの1つ(最初にロードするDLL)のロードに失敗し、エラーコード126(モジュールが見つかりません)を返します。本当に奇妙なのは、Windowsエクスプローラーから実行可能ファイルを実行するだけで正常に動作することです。

私は問題を診断するために通常の手順を実行しました。

  1. ファイルが存在し、現在の作業ディレクトリがそのファイルを指していることを確認します。
  2. 依存関係ウォーカーを実行し、依存関係が正しく読み込まれていることを確認します。この質問が失敗しても大丈夫だと言っているものを除いて、それらはすべて正常にロードされています。
  3. コード内の同じ場所にいくつかの異なるDLLをロードしてみてください。単純な「スタブ」dllのいくつかは成功しますが、ほとんどは失敗します。
  4. 別々のテストアプリから失敗しているDLLをロードしてみてください-空のコンソールアプリとベアボーンMFCアプリでは、すべてのDLLが正常にロードされています!
  5. LoadLibraryExとLOAD_LIBRARY_AS_DATAFILEフラグを使用してDLLをロードしてみてください。これは成功しますが、依存関係の問題である可能性があることを指摘する以外は、それほど遠くはありません。

この時点で他に何をすべきか本当にわかりません。私が言ったように、Office 2007は私たちの問題の一般的なスレッドですが、それがどのような問題を引き起こす可能性があるのか​​わかりません。次に何をすればいいのかわからない。何か案は?

編集:現在の作業ディレクトリが何らかの理由でDLLパスにないことはかなり確信しています。失敗しているDLLは、他のDLLを必要としているようです。ローダースナップのデバッグ出力をオンにすると、現在の作業ディレクトリがDLLの読み込みパスにないように見えます。これを引き起こす可能性のあるアイデアはありますか?

edit2:現在のビルドは、実行可能ファイルを作業ディレクトリ以外のディレクトリにダンプしました。何らかの理由で、DLLをロードしようとしたときに別のDLLをロードしようとすると、現在の作業ディレクトリが検索されなくなりました。ロードしようとしているすべてのDLLを含むディレクトリに実行可能ファイルを配置することで、問題は解決します。これらすべてとローダースナップによる出力に基づいて、これはVisual Studioの奇妙なバグであると98%確信しており、単に回避する必要があります。

4

2 に答える 2

1

Office 2007は、レジストリでSafeDllSearchModeをオンにします。

http://msdn.microsoft.com/en-us/library/ms682586%28VS.85%29.aspx

SafeDlLSearchModeを使用すると、現在のディレクトリは検索されなくなります。それを無効にするには、regeditに移動して、HKLM / System / CurrentControlSet / Control / SessionManager / SafeDllSearchModeを0に設定できると彼らは主張していますが、これは私には機能しませんでした。現在のディレクトリDIDにSetDllDirectoryを呼び出すことは私にとってはうまくいきますが、これはXPSP1+をターゲットにしている場合にのみ機能します。

これが私の特定のアプリで問題を引き起こした理由は、デバッガーから実行可能ファイルを実行するときに、他のすべてのビルドファイルとともに現在のディレクトリとは異なるディレクトリに実行可能ファイルを保持するためです。Visual Studioの外部で実行する場合は、最初に実行可能ファイルを他のすべてのDLLとともにディレクトリにコピーします。元の実行可能ファイルが呼び出されるディレクトリは常に検索パスにあるため、実行可能ファイルとdllを一緒に保持しておけば、この問題が発生することはありません。

それでも、Microsoftがこのように私たちの下のdll検索パスを変更することは非常に混乱しています。

于 2010-08-23T20:36:14.157 に答える
0

失敗した DLL には依存関係に MSVCRT80 がありますか? はいの場合、最も可能性の高い理由は、Office 2007 が MSVCR80.dll を上書きしたことです。

于 2010-08-23T19:33:18.677 に答える