2017-01-11 1 views
-1

C++ Windowsアプリケーションでクライアントdllを動的にロードします。だから私はACE_DLLを使用しています。私は私のアプリケーションでクライアントdllのクラスのオブジェクトを作成したいと思います。 私はラッパークラスを作成しました。メンバー関数の1つでは、ACE_DLLのオブジェクトが作成されます。 その後、そのオブジェクトを使用して、クライアントDLLをロードしています。次に、ACE_DLLオブジェクトを通してシンボル関数を呼び出し、クラスのコンストラクタの名前をクライアントdllに渡します。次に、コンストラクタのアドレスを含む関数ポインタ(_entry)を呼び出していますが、今回は「処理されない例外(アクセス違反)」というエラーが発生します。ACE_DLLを使用してクライアントC++ dllを動的にロードし、未処理例外としてエラーを返します。

私のアプローチが正しいかどうか教えてください。以下は私のアプリケーションの呼び出しシーケンスです。


ACE_DLL* _pDll; typedef Test* (*TestFP)(); TestFP _entry;


_pDll = new ACE_DLL();

_pDll->open("dllname_to_be_opend");

std::string sSymbol = "Test"; //クライアントDLL

でのテストクラスのコンストラクタのマングルされた名前Testdll.exeで0x00362b2fで//未処理の例外

_entry = (TestFP) _pDll->symbol(sSymbol.c_str());

:0xc0000005で:アクセス違反書き込み位置0x00362b0c。


は、ありがとう権利について見え プラサド

答えて

1

。 ACE_wrappers/tests/DLL_Test.exeを実行できますか?それがうまくいく場合は、テストコードを自分のものと比較してください。

+0

いいえ。マイテストアプリケーションが実行されていません。未処理の例外としてエラーを通知します。私は混乱している、私はクライアントのdllでtestクラスのコンストラクタのアドレスを取得することができますシンボル()メソッドを使用して、この関数のポインタを呼び出すと、テストクラスのオブジェクトを作成します。 –

+0

テストプログラムが実行されていない場合は、ビルドの問題が発生している可能性があります。あなたの環境に最もよく合ったビルドスコアボード(http://www.dre.vanderbilt.edu/scoreboard/)のビルドセットアップと、何が違うのかを比較することをお勧めします。 DLL_Testを動作させることができたら、戻ってプログラムを再実行してください。 –

0

ACE_DLL::openコールの戻り値がゼロであることを確認していませんあなたが

_pDll = new ACE_DLL(); 
_pDll->open("dllname_to_be_opend"); 
std::string sSymbol = "Test"; 
_entry = (TestFP) _pDll->symbol(sSymbol.c_str()); 

すなわち提示したコード(成功のために0、失敗した場合は-1)またはACE_DLL::symbol呼び出しの戻り値はゼロではないこと(失敗時に0が返されます)。

関連する問題