【发布时间】:2015-08-06 10:34:45
【问题描述】:
VC++:如何将 CString 值转换为 TCHAR*。一种方法是 GetBuffer(..) 函数。有没有其他方法可以将 CString 转换为 TCHAR*。
【问题讨论】:
-
为什么不能选择 GetBuffer?
标签: visual-c++ mfc
VC++:如何将 CString 值转换为 TCHAR*。一种方法是 GetBuffer(..) 函数。有没有其他方法可以将 CString 转换为 TCHAR*。
【问题讨论】:
标签: visual-c++ mfc
CString::GetBuffer() 不进行任何转换,它可以直接访问字符串。
复制CString:
TCHAR* buf = _tcsdup(str);
free(buf);
或
TCHAR* buf = new TCHAR[str.GetLength() + 1];
_tcscpy_s(buf, str.GetLength() + 1, str);
delete[]buf;
但是上面的代码通常没有用。您可能想像这样修改它:
TCHAR buf[300];
_tcscpy_s(buf, TEXT("text"));
通常您需要这样做才能将数据读入缓冲区,因此您希望缓冲区大小大于当前大小。
或者您可以只使用CString::GetBuffer(),同样您可能希望使缓冲区大小更大。
GetWindowText(hwnd, str.GetBuffer(300), 300);
str.ReleaseBuffer(); //release immediately
TRACE(TEXT("%s\n"), str);
在其他情况下,您只需要 const cast const TCHAR* cstr = str;
最后,TCHAR 不是很有用。如果您的代码与 ANSI 和 unicode 兼容,那么您不妨只将其设为 unicode。但这只是一个建议。
【讨论】:
这取决于您为什么需要非常量 TCHAR*。主要有两种情况:
手动更新 CString 对象的内容:
在这种情况下,您必须调用 CSimpleStringT::GetBuffer(指定最终字符串的最小长度),更新内容,并致电CSimpleStringT::ReleaseBuffer。调用ReleaseBuffer 是强制性的,因为它会更新内部状态。未能调用ReleaseBuffer 可能会导致字符串暴露意外行为。
无法在接口上公开 const 正确性:
如果是这种情况,您可以更新接口以采用 const TCHAR* 而不是 TCHAR*,然后调用 @987654324 @ 通过传递 CString 对象。
如果您无法更新接口,最好将副本复制到 TCHAR 数组中并传递指向该副本的指针。
如果您可以确保该实现永远不会修改通过TCHAR* 参数引用的内容,您可以改用const_cast。不建议这样做,因为它可以通过修改不相关的代码在将来引入错误。
【讨论】: