web-dev-qa-db-ja.com

WinXPでDWMAPI.DLL遅延ロードの依存関係を修正する方法は?

ロードしたときにDWMAPI.DLLが見つからないと主張するWinXPの下に.dllを作成しました。問題は、このDLLはVista DLLであり、これはXP IE7をインストールしているユーザーの既知の問題です。IE7をアンインストールするか修復することをお勧めしますプログラムの追加と削除を介して.NET Frameworkを修復しましたが、何も変更はありませんでした。「Windowsの再インストール」と同等ではない、より優れたソリューションが必要であるため、IE7をアンインストールするつもりはありません。

IE7をアンインストールしようとした人について悪いことを読んだことがあるので、私はそのルートに行くことに消極的です。

Visual Studio 2003(7.1)でC++を使用しています。アプリケーションの起動時に遅延読み込みを強制するオプションが表示されません。 DLLプロジェクトを作成したときにデフォルト設定を使用しました。リンカー->入力->遅延ロードDLLを見つけたので、強制的にDWMAPI.DLLを配置しました。遅延ロードされますが、リンクすると次のようになります。

LINK : warning LNK4199: /DELAYLOAD:dwmapi.dll ignored; no imports found from dwmapi.dll

..そして、それはもちろん、私のDLLをロードしようとしたときに何かを変更しませんでした。それについては、DWMAPI.DLLにつながるDLLのツリー全体を追加しましたが、同じメッセージが表示されます。 (記録については、foundation.dll-> Shell32.dll-> shdocvw.dll-> mshtml.dll-> ieframe.dll-> dwmapi.dllです。)

私がやっていることをより具体的にするために、Mayaプラグインを作成し、スクリプトエディターで常に役立つテキストを取得しています。

// Error: Unable to dynamically load : D:/blahblahblah/mydll.mll
The specified module could not be found.
 //
// Error: The operation completed successfully.
 //
// Error: The operation completed successfully.
 (mydll) //

最初にDependency Walkerを使用して問題を追跡しましたが、それがDWMAPI.DLLにつながった理由です。これらはメッセージによって異なりますが、DWMAPI.DLLは黄色の疑問符が横にある唯一のものです。

Warning: At least one delay-load dependency module was not found.
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module.

ジェラルドは正しい。実際、MayaはDependency Walkerとは異なるPATHを使用しています。プラグインは、Mayaプラグインディレクトリにある別のDLL(画像処理用))をロードし、問題なくそれを見つけましたが、Mayaはそうしませんでした。プラグイン」をMaya.envのPATHに追加します。

この問題は結局DWMAPI.DLLとは関係ありませんが、DWMAPIは一般的な問題であるため、DWMAPIの問題について見つけた最良のリンクをNovellのWebサイト here に投稿します。基本的に、ほとんどのプログラムではdepend.exeでこの警告が表示されますが、その横に遅延ロードアイコンがあり、プログラムが直接または間接的にDWMAPIを呼び出さないことが確実な場合は問題ありません。問題は他の場所にあります。遅延読み込みアイコンが表示されない場合は、Visual Studioの/ DELAYおよび/ DELAYLOADオプションを確認する必要があります。依存するという事実は、「エラー」ではなく「警告」を与えてくれました。これは、DWMAPIが自動的にロードされないという事実の手がかりでした。

27
Jim Buck

更新された問題に基づいて、DWMAPI.dllはおそらく問題ではありません。依存関係ウォーカーは、mshtmlにリンクしているときは常に、遅延ロードされたDLLを常にチェックするため、そのエラーを常に表示します。

この時点で、最善の推測は、ランタイムライブラリを動的にロードするようにプロジェクトを設定し、MayaがDLLの検索パスを変更していることです。そのため、MSVCランタイムDLLが見つからない可能性があります。長い間Mayaプラグインを開発していませんが、最近プラグインDLLを持っている他のアプリで問題が発生しました。

C/C++->コード生成->ランタイムライブラリの設定を、マルチスレッドDLLではなくマルチスレッドに変更してみてください。

それとは別に、Dependency Walkerをいじって、Mayaと同じ検索パスを使用し、別の依存関係の問題を見つけられるかどうかを確認できます。

最後の手段として、Mayaをデバッガで起動し、LoadLibraryにブレークポイントを設定して、その方法でロードされていないライブラリを見つけることができます。

7
Gerald

私はまさにこの問題を抱えていました。

解決するのに何時間もかかった卑劣な問題。

とにかく。リリースマシンでマネージC++アプリケーションをコンパイルしました。実行できなかったお客様から苦情が寄せられ、すべてのマシンで魅力のように機能しました。

リリースマシンには、ATLの脆弱性が修正され、1か月前にATLの脆弱性が修正され、1台のXPマシン。

その特定のXPマシンもアプリケーションを実行できませんでした。ATL修正プログラム(下記のリンクを参照)とvoiláをインストールしました。

http://www.Microsoft.com/downloads/details.aspx?familyid=766A6AF7-EC73-40FF-B072-9112BAB119C2&displaylang=en

したがって、教訓は、常に中間マニフェスト(デバッグまたはリリースディレクトリにある)を確認することです。これにより、プログラムがリンクされているDLLのバージョン)がわかります。

それが誰にも役立つことを願っています。

3
ROAR

これは難しいものです。このエラーが発生する主な方法は2つあります。

1)アプリケーションの起動時に、ロードされたDLLを強制的にロードするようにプロジェクトを設定しました。 DWMAPI.dllは遅延ロードされたDLLです。したがって、通常はその関数の1つが呼び出されない限りロードされません。XP DLLでそれを実行しようとしていますが、コンパイラオプションを設定して、アプリに遅延ロードされたDLLを強制的にロードさせることができます。

2)多くの場合、別の問題がある場合、depends.exeから取得する誤ったエラーです。依存関係ウォーカーを介してDLLを実行し、他の依存関係の問題があるかどうかを確認してください。 IE7では、実際のエラーが表示されます。IE7を後で再インストールできます。

3
Gerald

C/C++->コード生成->ランタイムライブラリの設定を、マルチスレッドDLLではなくマルチスレッドに変更してみてください。

2
user450279