如何将 _bstr_t 转换为 CString。

14

我有一个_bstr_t变量bstrErr和一个CString变量csError。我应该如何将bstrErr中的值设置为csError中的值?

5个回答

20

直接强制类型转换不行吗:

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

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


7

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

您只需使用以下方式分配字符串:

csError = bstrErr.GetBSTR();

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

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


3
如果您编译为 Unicode,则只需将封装的 BSTR 赋值给 CString。如果您编译为 ANSI,则必须使用 WideCharToMultiByte() 进行转换。
此外,请注意,封装的 BSTR 可能为空,这对应于空字符串。如果您不注意这一点,您的程序将遇到未定义的行为。

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();

1
我的回答应该不仅仅包括代码。你改变/做了什么?为什么要这样做?- 来自审查 - Error - Syntactical Remorse

0

CStringTCStringCStringACStringW

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

我在代码中从不使用CString,而是总是使用显式类CStringACStringWCString*类具有接受窄字符串和宽字符串的构造函数。对于_bstr_t也是如此。类型为BSTR的字符串必须由函数SysAllocString()分配,该函数需要一个OLECHAR字符串,因此在Win32/64中是宽字符串。如果您想将包含Unicode的_bstr_t复制到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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接