私はシングルトン(これはVS2015のプロジェクトにヘッダで使用されているVS2008 DLL/libにある)ブーストini_parser - シングルトンDLLの問題
UtilIniFile &UtilIniFile::GetIniFile()
{
static UtilIniFile s_IniObject;
if (/*check if file has been loaded*/)
{
s_IniObject.Load(s_IniObject.m_fullfile);
}
return s_IniObject;
}
ロード関数が呼び出されるとiniファイルを持っていますエラー/例外なしで正しく解析されます。例外なく -
//boost::property_tree::ptree m_PropTree;
boost::property_tree::ini_parser::read_ini(CT2A(filename).m_szBuffer, m_PropTree);
値は、書き込み機能が存在するが、何の問題もなくptreeでから読み取るptreeで/ファイルへの書き込みはありません、です。
get関数は次のようになります。
template <class TValue>
bool GetValue(const std::string §ion, const std::string &key, TValue &value, const TValue &defaultValue = TValue())
{
try
{
value = m_PropTree.get<TValue>(section + '.' + key, defaultValue);
}
catch (const boost::property_tree::ptree_error &)
{
return false;
}
return true; //All fine
}
get関数は、IMO、正しく呼び出されたコード内の他のすべての取得機能など。シングルトンゲッターGetIniFile
にデバッグし、その値を検査する場合
std::string str;
sSingletonDefine.GetValue<std::string>("SECTION", "Key", str, "defValue");
、すべてが正常に見える、シングルトンの内部ptreeでは、メンバー上の適切なアドレスを持っています。ファンクションから戻ってテンプレートGetValue<std::string>(...)
にデバッグすると、ptreeはm_children = 0x0000000f
と表示されます。これは、GetValue
関数がDLL内から呼び出されたときには起こらない。 MFCクラスのどこかに、呼び出される関数があります。この関数はDLLに入り、そこでiniファイル/ ptreeから何かをロードします。 VS'15プロジェクトから直接値をロードしようとすると、「奇妙な」振る舞いになります。 ptree.get
が呼び出される直前に、GetValue
テンプレートでLoad
呼び出しを追加、Load
関数の内部でptreeでのメンバーはGetValue
テンプレートで有効なアドレスとバックアドレスが再び無効でいても
。もちろんそれはその後、this was 0xF.
がクラッシュします。 DLLがアンロードされていません。
DLLを使用しないテストプログラムでこの問題を再現することは明らかに不可能です。値が正しくロードされ、プログラムは実行を続けます。
誰もがスミラの問題を経験したことがありますか、またはこの問題の可能な解決方法/修正方法/回避策を知っている人はいますか?
異なるバージョンのVC間でstd :: xxxクラス(テンプレート)を渡すことは、未定義の動作です。 MSは内部レイアウトを変更しました。あなたは 'C'インタフェースしか持たない限り、全く同じコンパイラバージョン(同じMSVCバージョンではない)ですべてのコンポーネントを構築することをお勧めします。 –
@RichardCritten私はプロジェクトを管理していないことを認識しています。それらを使用するためのdll /ヘッダー。ソースにアクセスできますが、これらの古いプロジェクトをすぐにVS'15に変更またはアップグレードする予定はありません。私はこれがここの問題だとは思わない。 – Blacktempel