だから、別の解決策でDLLを参照するメインプログラムがあります。ここでは設計コードは次のとおりです。DLL内にあるときにC++静的ベクトルが要素を失う
//.h of DLL
#ifdef DLL_PREPRO
#define DLL_LINK __declspec(dllexport)
#else
#define DLL_LINK __declspec(dllimport)
#endif
enum MyID
{
//values here....
}
DLL_LINK class MyCustomClass
{
public:
MyID id;
LPCTSTR lpszApp;
LPCTSTR lpszKey;
LPCTSTR lpszDefault;
CString& strData;
}
static vector<MyCustomClass> m_customClass; //the vector in question
DLL_LINK void InitTables();
//I have other custom classes that has almost similar structure to this, and with their corresponding vector
//on the .cpp is the implementation of function InitTables() that is called by the EXE side wherein I am doing some processing on the vectors
//.cpp on the EXE side
void AddCustomClass(MyCustomClass c)
{
(&m_customClass)->push_back(c);
}
//I have another method here who populates the vector by calling AddCustomClass repeatedly
私の問題は、デバッグ中に、exeファイルの側に私は(私は「watch'-INGのために、それぞれのベクトルを追加することによってこれを行う)ベクターが移入取得を参照してください、私はステップするときということですオーバーフロー(F10)をInitTables関数のdll側に置くと、すべてのベクトルに0要素が含まれるようになりました。 私は、DLLのcppファイルをexeソリューションにドラッグして、ブレークポイントを設定できるようにしました。 空の要素を持つベクトルにアクセスするとエラーが発生するため、私は一時的にInitTables()関数の上に戻ります。その後、私がexeソリューションの次の行に戻ってに再びF10したとき、すべてのベクトルの要素はに戻ります。
私の質問は、設計/ソースコードの何が問題なのか、これをどのように修正するべきかということです。ありがとうございました!
両方のプロジェクトは、同じバージョンのMSVCと全く同じオプションで構築されていますか? MSVCはバージョン間でのC++ ABI互換性を保証しておらず、コンパイルオプションの違いによりABIも破損することがあります。 –
どちらもVS2010プロでビルドされていますが、私は2つのプロジェクトプロパティにいくつかの違いがあると思います。 _Background:_ beforeは1つだけのプログラムで、他のプロジェクトでDLLとして使用されている部分が区切られています。 –
背景:MSVCは、バージョン間で標準ライブラリコレクション(および他のクラス)の内部レイアウトを変更しました。したがって、異なるバージョンで構築されたモジュール間で標準ライブラリクラスを渡すことで、あなたが見ている効果を正確に与えることができます。 –