从函数返回的Mangled LPCTSTR字符串

时间:2012-01-12 22:54:05

标签: mfc clr bstr

我有两个项目,A和B

项目A编制为:
 1.标准Windows库  2.多字节字符集
 3.没有共同的语言支持

项目B编制时:
 1. MFC作为动态dll
 2.多字节字符集
 3.使用通用语言支持

以下函数在项目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);

但是当调用驱动程序名称时,“name”的内容是垃圾

1 个答案:

答案 0 :(得分:4)

一个经典错误,你将返回一个指向本地对象的指针,该对象在函数结束时到达其生命周期的末尾。包含字符串的堆栈被释放并用随机的东西覆盖。

更具体地说,您将返回一个指向CString对象内部数据结构的指针,该数据结构在CString被销毁时失效。

如果两个项目都使用相同版本的CString,您可以返回其中一个而不是LPCTSTR。