6

私はいくつかの関数を含む C dll をテストする小さな C++ プログラムを書いています。これらの dll にはデバッグ バージョンとリリース バージョンがあり、同じプログラムで両方をロードして、以前のバージョンと比較したいと考えています。

問題は、リリース構成でプログラムをコンパイルすると、リリースされている dll しか使用できず、デバッグ構成を使用してプログラムをコンパイルすると、デバッグでもある dll しか使用できないことです。

LoadLibrary および GetProcAddress 関数を使用して dll/関数をロードします。

関数には と の 2 種類があり void type1(int&)ますvoid type2(vector<string>*)。タイプ 1 は、構成に関係なく正常に動作します。ただし、タイプ 2 は構成が一致する場合にのみ機能します。

コード:

typedef void(*GetNames)(vector<string>*);
GetNames get_var_names = (*GetNames)GetProcAddress(dll,"get_var_names");
vector<string> var_names;
get_var_names(&var_names);

最後の行は、「0xC0000005: アクセス違反の読み取り場所 0xbaadf008」のようなエラーでプログラムが失敗する場所です。呼び出しプログラムとdllの構成が一致しない場合。このエラーは、プログラムがリリースで dll がデバッグの場合は読み取り違反ですが、プログラムがデバッグで dll がリリースの場合は書き込み違反です。

関数がすべきことは、異なる文字列で push_back("x") を数回呼び出すだけです。

リリース構成プログラムでデバッグ dll を使用することは完全に不可能ではないようです。また、タイプ 1 のすべての機能も動作しないため、ベクトルまたは文字列クラスと関係があるようです。

誰でもこれを解決する方法を知っていますか、または私の唯一の選択肢である異なる構成の2つの実行可能ファイルを使用していますか?

4

1 に答える 1

6

多くの (すべてではないにしても) STL クラスは、DEBUG ビルドに異なるレイアウトを使用します。そのため、プログラムの RELEASE ビルドで dll (std::string や std::vector など) から DEBUG でコンパイルされたクラスを使用することはできません。

dll のインターフェイスで STL-types/class を使用することを避け、代わりに組み込み型を使用する必要があります。その場合、これらの問題が発生することはありません。

ところで:私はもちろんMSVC ++について話している(私が知らない他のコンパイラ)。

于 2012-06-06T15:07:41.093 に答える