2017-06-29 8 views
1

だから、別の解決策で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したとき、すべてのベクトルの要素はに戻ります。

私の質問は、設計/ソースコードの何が問題なのか、これをどのように修正するべきかということです。ありがとうございました!

+0

両方のプロジェクトは、同じバージョンのMSVCと全く同じオプションで構築されていますか? MSVCはバージョン間でのC++ ABI互換性を保証しておらず、コンパイルオプションの違いによりABIも破損することがあります。 –

+0

どちらもVS2010プロでビルドされていますが、私は2つのプロジェクトプロパティにいくつかの違いがあると思います。 _Background:_ beforeは1つだけのプログラムで、他のプロジェクトでDLLとして使用されている部分が区切られています。 –

+0

背景:MSVCは、バージョン間で標準ライブラリコレクション(および他のクラス)の内部レイアウトを変更しました。したがって、異なるバージョンで構築されたモジュール間で標準ライブラリクラスを渡すことで、あなたが見ている効果を正確に与えることができます。 –

答えて

2

問題は、ヘッダファイルに静的keyworkを使用していることである:この文脈静的手段で

static vector<MyCustomClass> m_customClass; //the vector in question 

:このシンボルは、現在の単位で表示されています。 このヘッダーファイルを含む各.cppファイルには、このグローバル変数の独自のインスタンスがあります。事実、この変数のインスタンスを10個持つことができます。名前空間スコープ変数にstatic指定子は、変数内部リンケージを行います

vector<MyCustomClass> m_customClass; 
+0

私はあなたが言ったことを試みたが、それはエラーLNK2001未解決の外部のシンボルを与えた。私が理解しているところでは、実際の宣言を含むcppファイルを見る必要がありますが、私のケースでは、エラーはDLL部分にあり、参照されているものです。私はこれに対してどのように取り組むべきですか? –

+0

ご迷惑をおかけしています。 externは「変数の宣言です」と言っていますので、その定義はありませんでした。 –

+0

私はちょうど明確にしましょう:EXEのcppでこのDLLをexternにすることになっていますか、またはDLL内に他のcppがあることを意味していますか?私は申し訳ありませんがかなり混乱しています。 –

0

extern DLL_LINK vector<MyCustomClass> m_customClass; 

そして、それぞれの.cppファイル内だけ追加します。

は、おそらくあなたは、このような何かをしたかったです。つまり、各ファイルにそのような変数のコピーがあることを意味します。明らかにあなたが望むものではありません。変数をDLLに定義してEXEからアクセスする場合は、実際にextern(エクスポートされたもの)でなく、staticでなければなりません。

関連する問題