14

我有一个_bstr_t变量bstrErr,我有一个CString变量csError。如何设置进来的bstrErrcsError

4

5 回答 5

20

难道不能只投它:

_bstr_t b("Steve");
CString cs;
cs = (LPCTSTR) b;

我认为当项目是 Unicode 时这应该可以工作。

于 2009-11-06T06:39:36.967 回答
7

CString 具有 LPCSTR 和 LPCWSTR 的构造函数和赋值运算符,因此永远不需要调用 WideCharToMultiByte,并且在 unicode 或非 unicode 模式下不会出现转换错误。

您可以这样分配字符串:

csError = bstrErr.GetBSTR();

或者使用构造函数 CString csError( bstrErr.GetBSTR() );

我正在使用 GetBSTR。这与使用 (LPCWSTR) 强制转换 bstrErr 相同,但我更喜欢它的易读性。

于 2009-11-17T04:49:41.523 回答
3

如果您为 Unicode 编译 - 只需将封装的 BSTR 分配给 CString。如果为 ANSI 编译,则必须使用 WideCharToMultiByte() 进行转换。

另请注意,封装的 BSTR 可以为空,对应于空字符串。如果您不注意这一点,您的程序将遇到未定义的行为。

于 2009-11-06T06:43:04.947 回答
0
BSTR myBSTRVal;
CString BSTRasCString("")
char  szValue[MAX_PATH] = "";

// This will map the BSTR to a new character string (szValue)
WideCharToMultiByte(CP_ACP, 0, myBSTRVal, -1, szValue, sizeof(szValue), NULL, 
NULL);
BSTRasCString.Format("%s", szValue);                
BSTRasCString.TrimLeft();
BSTRasCString.TrimRight();
于 2017-08-15T15:53:47.797 回答
0

CStringT, CString,CStringACStringW:

  • CStringT是一个基于任意字符类型的复杂类模板和用于管理存储和特性的辅助类模板。
  • 该类CString是使用TCHAR字符类型的模板类的 typedef。TCHAR是一个泛型类型,wchar如果设置了宏,UNICODE则解析为,否则解析为char.
  • 该类CStringA是在内部使用窄字符类型的模板类的 typedef char
  • 该类CStringW是在内部使用宽字符类型的模板类的 typedef wchar_t

我从不CString在代码中使用,而是总是使用显式类CStringACStringW. 这些类CString*具有接受窄字符串和宽字符串的构造函数。对于_bstr_t. 类型的字符串BSTR必须由 SysAllocString()需要OLECHAR字符串的函数分配,因此在 Win32/64 中是宽字符串。如果要将_bstr_t包含 Unicode 的 a 复制到 a CStringA,则必须将其转换为 UTF8。我使用类CW2ACA2W转换。

在 Word 加载项的以下事件函数中,我展示了这些类型的用法:

STDMETHODIMP CConnect::TestButtonClicked(IDispatch* Command)
{
  BSTR smi = SysAllocString(L"Two smileys  in a row: ");
  _bstr_t ley = L"\U0001F60A";

  /* Either using CStringA, UTF16 -> UTF8 conversion needed */
  CStringA smiley(CW2A(smi, CP_UTF8));
  smiley += CW2A(ley.GetBSTR(), CP_UTF8);
  MessageBoxW(NULL, CA2W(smiley, CP_UTF8), L"Example", MB_OK | MB_TASKMODAL);

  /* Or using CStringW, use ctor and += operator directly
  CStringW smiley = smi;
  smiley += ley.GetBSTR();
  MessageBoxW(NULL, smiley, L"Example", MB_OK | MB_TASKMODAL);
  */

  SysFreeString(smi);

  return S_OK;
}
于 2019-04-09T09:16:03.630 回答