27

WinXP で .dll を作成しましたが、ロード時に DWMAPI.DLL が見つからないと主張しています。問題は、この DLL が Vista DLL であることです。これは、IE7 がインストールされている XP ユーザーにとって既知の問題です。IE7 をアンインストールするか、[プログラムの追加と削除] を使用して .NET Framework を修復することをお勧めします。修理をしましたが、何も変わりませんでした。「Windows の再インストール」と同等ではないより良い解決策が必要なので、IE7 をアンインストールするつもりはありません。

私は IE7 をアンインストールしようとした人々について悪いことを読んだことがあるので、その道を行くのは気が進まない。

Visual Studio 2003 (7.1) で C++ を使用しています。アプリケーションの起動時にロードを強制的に遅らせた可能性があるオプションが表示されません。DLL プロジェクトを作成したときは、デフォルト設定を使用しました。私は興味深いオプションを見つけました.Linker->Input->Delay Loaded DLLsなので、そこに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 に「;plug-ins」を追加する必要がありました。

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

4

4 に答える 4

7

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

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

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

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

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

于 2008-10-06T21:40:39.417 に答える
3

これはトリッキーです。このエラーが発生する主な方法は 2 つあります。

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

2) 別の問題が発生した場合に、depends.exe から得られる誤ったエラーであることがよくあります。依存関係ウォーカーを介して DLL を実行し、他の依存関係の問題があるかどうかを確認します。他のすべてが失敗した場合は、IE7 をアンインストールしてみて、問題が解決しないかどうかを確認してください。偽のエラーである場合は、IE7 をインストールした後に実際のエラーが表示されます。その後、IE7 を再インストールできます。

于 2008-10-06T07:50:53.070 に答える
3

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

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

ともかく。マネージ C++ アプリケーションをリリース マシンでコンパイルしました。それを実行できないという顧客からの苦情を受け取りましたが、すべてのマシンで魅力的に機能しました。

リリース マシンは 1 か月前のある晩、ATL 脆弱性修正プログラムを自動的に適用されたことが判明しました。1 台の XP マシンを除いて、他のすべてのマシンも同様でした。

その特定の XP マシンでも、アプリケーションを実行できませんでした。ATL 修正プログラム (以下のリンクを参照) をインストールすると、ほら、すべてが以前と同じように機能しました。

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

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

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

于 2009-08-25T12:10:38.290 に答える
2

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

于 2010-09-17T05:41:08.047 に答える