私はいくつかの関数を含む 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つの実行可能ファイルを使用していますか?