使用 ATL 将 LPTSTR 转换为 LPWSTR
LPTSTR to LPWSTR conversion using ATL
假设我有这个:
LPTSTR MyString = _T("A string");
void SomeFunction(LPCWSTR param);
我可以使用 ATL conversion macros、CT2CW
之一,并且函数按预期工作:
SomeFunction(CT2CW(MyString));
但是,如果我有这样的事情:
LPWSTR WString = CT2CW(MyString); // or CT2W, it doesn't matter
现在 WString
不包含我期望的内容;它似乎只是包含垃圾。我敢肯定这是一些时髦的指针业务,但我很难过。
当 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");
void SomeFunction(LPCWSTR param);
我可以使用 ATL conversion macros、CT2CW
之一,并且函数按预期工作:
SomeFunction(CT2CW(MyString));
但是,如果我有这样的事情:
LPWSTR WString = CT2CW(MyString); // or CT2W, it doesn't matter
现在 WString
不包含我期望的内容;它似乎只是包含垃圾。我敢肯定这是一些时髦的指针业务,但我很难过。
当 CT2CW
对象被销毁时,用于存储字符串的内存被释放。
事实上,您链接到的 MSDN 页面已经提到了这个确切的问题。
在 SomeFunction(CT2CW(MyString));
中,临时 CT2CW
对象在整个语句(包括函数调用)执行之前不会被销毁 - 参见 "Life span of temporary arguments?".
在LPWSTR WString = CT2CW(MyString);
中,临时CT2CW
对象在整个语句执行后被销毁。也就是说,这条语句执行后,WString
指向的内存已经被释放了。
正如您链接到的 MSDN 文章中已经提到的那样,解决方案是使用局部变量而不是临时对象:
CT2CW WString(MyString);
局部变量在其范围结束之前不会被销毁。