2

Visual Studio 2010 を使用して、サード パーティ アプリ (AviSynth) へのプラグインとして 32 ビット DLL を作成しています。FFTW (http://fftw.org) DLL を使用しようとするまで、DLL はサードパーティ アプリによって正しく読み込まれていました。32 ビットの FFTW DLL を使用し、「lib /def:libfftw3-3.def」を実行して .lib ファイルを作成し、それをプロジェクトのリソースとして追加しました。関数をいくつか呼び出しました。コンパイルは正常に行われますが、サードパーティのツールにロードしようとすると失敗します。

FFTW DLL を DLL と一緒に配置しようとしました。また、DllMain 内から LoadLibrary を使用しようとしましたが、まだ機能していません。

DllMain 関数と AviSynth によって呼び出される関数 (AvisynthPluginInit2) でデバッガーを停止できますが、AviSynth はその後 DLL をロードできないと主張し、以前に呼び出された関数の先頭にあるブレークポイントはヒットしなくなりました。 .

AviSynth のエラー メッセージは次のとおりです。

ご協力いただきありがとうございます。

4

2 に答える 2

2

このようなものを取得したときに最初に試すのは、Dependency Walker です。

http://www.dependencywalker.com/

考えられるすべての問題を検出できるわけではありませんが、単純な問題 (DLL の欠落、エクスポートの欠落) は非常に迅速にチェックできます。また、ファイル拡張子をダブルクリックして、任意の数のファイル拡張子を開くように設定することもできます。通常、.dll、.ax、.ocx、.sys、.exe を設定します。

IMO は Windows 開発者にとって不可欠なツールの 1 つです。

ps: Dependency Walker で問題が見つからない場合は DLLをロードしてLoadLibrary()GetLastError()が返されるかを確認してください。


ところで:

また、DllMain 内から LoadLibrary を使用しようとしましたが、まだ機能していません。

LoadLibrary()からは発信できませんDllMain()

エントリポイント関数は、単純な初期化または終了タスクのみを実行する必要があります。LoadLibrary または LoadLibraryEx 関数 (またはこれらの関数を呼び出す関数) を呼び出してはなりません。これは、DLL の読み込み順序で依存ループが作成される可能性があるためです。

エントリポイント関数はあなたのものですDllMain

于 2011-04-19T16:25:58.453 に答える
0

FFTW DLL は、AVISynth プラグイン ディレクトリではなく、AVS スクリプトと同じディレクトリにある必要があることが判明しました。Virtual Dub の作業ディレクトリだと思います。

とにかく、それは今動作します。助けてくれてありがとう!

于 2011-04-19T19:03:39.220 に答える