【问题标题】:LPTSTR to LPWSTR conversion using ATL使用 ATL 将 LPTSTR 转换为 LPWSTR
【发布时间】:2015-03-18 03:20:14
【问题描述】:

假设我有这个:

LPTSTR MyString = _T("A string"); 
void SomeFunction(LPCWSTR param);

我可以使用ATL conversion macrosCT2CW 之一,并且该功能按预期工作:

SomeFunction(CT2CW(MyString));

但是,如果我有这样的事情:

LPWSTR WString = CT2CW(MyString); // or CT2W, it doesn't matter

现在WString 不包含我所期望的;它似乎只是包含垃圾。我确信这是一些时髦的指针业务,但我很难过。

【问题讨论】:

  • 你为什么要和TCHAR混在一起根本?阅读stackoverflow.com/questions/234365/is-tchar-still-relevant/… 无论如何,WString 以何种方式不包含您的预期?是在下一行出现这种情况,还是在返回后才出现这种情况?
  • @Deduplicator 我正在修改一个庞大的现有代码库。除非我无缘无故地重做和重新测试大量代码,否则我对此无能为力。 WString 包含完全乱码的数据。
  • 好吧,祝你好运和毅力比。总是有这样的情况......

标签: c++ unicode atl tchar


【解决方案1】:

CT2CW 对象被销毁时,用于存储字符串的内存被释放。

事实上,您链接到的 MSDN 页面已经提到了这个确切的问题。

SomeFunction(CT2CW(MyString)); 中,临时CT2CW 对象在整个语句(包括函数调用)执行完毕之前不会被销毁 - 请参阅"Life span of temporary arguments?"

LPWSTR WString = CT2CW(MyString); 中,临时CT2CW 对象在整个语句执行完毕后被销毁。这意味着在这条语句执行之后,WString 指向已经被释放的内存。

正如您链接到的 MSDN 文章中已经提到的那样,解决方案是使用局部变量而不是临时对象:

CT2CW WString(MyString);

局部变量在其作用域结束之前不会被销毁。

【讨论】:

  • 谢谢。但是现在当我尝试LPTSTR MyString = _T("A string"); LPWSTR WString; CT2W WString(MyString); 时,它给了我这个错误"error C2040: 'WString' : 'ATL::CA2W' differs in levels of indirection from 'LPWSTR'"。我假设 this 是指针问题?
  • @quantumSoup 你为什么要用不同的类型定义WString 两次? (CT2W 已经可以隐式转换为 LPWSTR,如果这就是混淆的原因)
  • 现在一切都说得通了。自从大学作业以来,我就没有用 C++ 编写过代码,而且我想多了。谢谢。
猜你喜欢
  • 1970-01-01
  • 2010-09-25
  • 2016-06-07
  • 2011-10-15
  • 2019-02-01
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 2023-03-26
相关资源
最近更新 更多