1

AとBの2つのプロジェクトがあります

プロジェクト A は次のようにコンパイルされます
。 1. 標準 Windows ライブラリ
2. マルチバイト文字セット
3. 共通言語サポート なし

プロジェクト B は次のようにコンパイルされます
。 1. 動的 dll としての MFC
2. マルチバイト文字セット
3. WITH を使用した共通言語サポート

プロジェクト 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

1 に答える 1

4

典型的な間違いです。関数の最後で有効期間が終了するローカル オブジェクトへのポインターを返しています。文字列を含むスタックが解放され、ランダムなもので上書きされます。

より具体的には、CString が破棄されると無効になる CString オブジェクト内のデータ構造へのポインターを返しています。

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

于 2012-01-12T23:12:15.620 に答える