关于Visual C ++:VC ++:如何将CString转换为TCHAR *

VC++: how-to convert CString to TCHAR*

VC ++:如何将CString值转换为TCHAR *。一种方法是GetBuffer(..)函数。 还有什么其他方法可以将CString转换为TCHAR *。


CString::GetBuffer()不会进行任何转换,它可以直接访问字符串。

要复制CString

1
2
TCHAR* buf = _tcsdup(str);
free(buf);

要么

1
2
3
TCHAR* buf = new TCHAR[str.GetLength() + 1];
_tcscpy_s(buf, str.GetLength() + 1, str);
delete[]buf;

但是,上面的代码通常没有用。您可能想要像这样修改它:

1
2
TCHAR buf[300];
_tcscpy_s(buf, TEXT("text"));

通常,您需要这样做才能将数据读入缓冲区,因此您要使缓冲区大小大于当前大小。

或者,您可以只使用CString::GetBuffer(),您可能想再次增大缓冲区的大小。

1
2
3
4
GetWindowText(hwnd, str.GetBuffer(300), 300);
str.ReleaseBuffer(); //release immediately
TRACE(TEXT("%s\
"), str);

在其他情况下,您只需要const cast const TCHAR* cstr = str;

最后,TCHAR不是很有用。如果您的代码与ANSI和unicode都兼容,那么您也可以仅使其成为unicode。但这只是一个建议。


这取决于为什么需要非常量TCHAR*。主要有两种方案:

  • 手动更新CString对象的内容:

    在这种情况下,您将必须调用CSimpleStringT :: GetBuffer(指定最终字符串的最小长度),更新内容,然后调用CSimpleStringT ::: ReleaseBuffer。强制调用ReleaseBuffer,因为它会更新内部状态。未能调用ReleaseBuffer可能导致字符串暴露意外行为。

  • 无法在接口上公开const正确性:

    如果是这种情况,您可以更新接口以使用const TCHAR*而不是TCHAR*,然后通过以下方式调用CSimpleStringT :: operator PCXSTR传递CString对象。
    如果无法更新接口,则最好将其复制到TCHAR数组中,然后将指针传递给该副本。
    如果可以确保该实现永远不会修改通过TCHAR*参数引用的内容,您可以使用const_cast。不建议这样做,因为将来通过修改不相关的代码可能会引入错误。