2016-06-13 11 views
1

私は3つのライブラリa.lib、b.lib、c.dllに依存する静的ライブラリを作成しました。今私はテストプロジェクトを書いており、このプロジェクトでうまく動作します。しかし、この静的ライブラリをdllの1つに含めてx.dl​​lとし、後でこのdllをプロジェクトで使用する別のプロジェクトがあります。LoadLibraryがビジュアルスタジオで返されることはありません2013 C++ project

プロジェクトがLoadLibraryを使用してx.dl​​lをロードしようとすると、それが返されずに待機し続けることになります。私はc.dll b.libとa.libをすべて同じ場所に保存していますが、まだロードできません。 依存関係ウォーカーを使用しようとしましたが、このライブラリを含める前と後で多くの差異を見ることができません。

問題を特定するにはどうすればよいですか? 万が一、.libにすべての依存関係を含めることはできますか?静的ライブラリ以降、すべての依存関係をそれ自身に含める必要がありました。 ご協力いただきありがとうございます。 プロジェクトはビジュアルスタジオでVisual C++ 2013です。

+0

LoadLibrary()でプログラムのデッドロックが発生するのは、DllMain()のエントリポイントにあまりにも多くのコードを配置するという説明が1つしかありません。基本的なヘルプのGoogle "dllmain loader lock"ありがとうKeyu。 –

答えて

1

LoadLibrary DLLファイルのDllMain()を呼び出します。それはDLLのためのmain()のようなものです。 DllMainに何かデッドロックされているはずです。

注:DLLのコードにはDllMainが含まれていないことがありますが、コンパイラでグローバル変数を初期化するためのコンパイラが自動的に作成されるため、問題が発生する可能性があります。

LoadLibraryExDONT_RESOLVE_DLL_REFERENCESに設定するとわかります。フラグはDllMainを無効にし、依存関係の読み込みを無効にします。成功すると、問題はDllMainにあります。あなたはNtdll.LdrpCallInitRoutineにブレークポイントでき、デバッグに

(しかし、あなたは、ほぼすべての現代のDLLがDllMainなしincorretly振る舞い、今DLLを使用することはできません)、DllMain()は、この関数内で呼ばれています。

+0

確かに、問題はDllMainのように見えます。私はDONT_RESOLVE_DLL_REFERENCESを設定したLoadLibraryExを使用し、ライブラリをロードすることができました。しかし、どうすればこの問題を取り除くことができますか?あなたはDLLがこれで使用できなくなると言った。 LoadLibrary自体で動作するようにライブラリをコンパイルすることはできますか? – user888270

+0

はいできます。しかし、多くのコードを変更する必要があります。 1)プロジェクトタイプを静的ライブラリから動的ライブラリに変更する必要があります。 2)すべてのパブリック関数、メンバー、クラスにdllexport記述子を付ける。エクスポートされたものを明確にするために、追加のexports.defを作成する必要があるかもしれない。そしてそれを再コンパイルしてください。 3)リンクヘッダーファイルとlib(静的ファイルとは異なり、DLLへの参照のみです)ファイルをプロジェクトに追加します。 4)libファイルの代わりにLoadLibraryを使用する必要がある場合は、エクスポートされたすべての関数を関数ポインタとして宣言する必要があります。 GetProcAddressを呼び出してそれらを埋めてください。 –

+0

さらに、使用できないdllを使用してみることもできます。非常に少数の時間で、使用することは大丈夫です。 –

関連する問題