2012-01-12 3 views
1

から返されると、BマングルされたLPCTSTR文字列はA、私は2つのプロジェクトを持っている機能

プロジェクトAをしてコンパイルされています
1.標準のWindowsライブラリを
2.マルチバイト文字が
3. NO共通の設定しました言語サポート

プロジェクトBがコンパイルされて:動的なDLL
2.マルチバイト文字が共通の言語を使用して
3を設定するよう
1. MFC支持

次の関数は、プロジェクトAに定義されている:

LPCTSTR CAppProxy::DriverName(IDriverAgent *driver) 
{ 
    BSTR bstr; 
    HRESULT hr = driver->get_Name(&bstr); 
    CString str = CString(bstr); 
    return(str); 

}

と使用プロジェクトBから呼び出される:

CString name = appProxy->DriverName(driver); 

が、ドライバ名が呼び出され、コンテンツを「名前」の名前はゴミです

答えて

4

古典的な間違いは、ファンクションの終わりにその存続期間の終わりに達するローカルオブジェクトに転送する。文字列を含むスタックは解放され、ランダムなもので上書きされます。

具体的には、CStringオブジェクトが破壊されたときに無効化されるCStringオブジェクト内のデータ構造体へのポインタを返します。

両方のプロジェクトで同じバージョンのCStringを使用している場合は、LPCTSTRの代わりにそのいずれかを返すことができます。

+0

はいわかりました。私はプロジェクトBのファイルを所有していないので、CStringを返すオプションは私には利用できません –

+0

@AndrewS。プロジェクトAを制御できれば、戻り値の型を変更できます。何らかの理由でProject Bを再コンパイルして新しい関数シグネチャに適合させることができない場合は、良いオプションは残っていません。一つの悪い選択肢は、CStringを 'static'オブジェクトを返すようにすることです。つまり、関数はもはやスレッドセーフではありません。 –

関連する問題