【问题标题】:How to convert _bstr_t to CString如何将 _bstr_t 转换为 CString
【发布时间】:2023-04-01 23:00:02
【问题描述】:

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

【问题讨论】:

    标签: c++ com mfc visual-c++ bstr


    【解决方案1】:

    难道就不能投吗:

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

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

    【讨论】:

      【解决方案2】:

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

      你可以这样分配字符串:

      csError = bstrErr.GetBSTR();

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:
          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();
          

          【讨论】:

          • 我可以回答的不仅仅是代码。你改变了什么/做了什么?你为什么那样做? - 来自评论
          【解决方案5】:

          CStringTCStringCStringACStringW

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

          我从不在代码中使用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;
          }
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-11-23
            • 2012-03-07
            • 2011-07-29
            • 2014-11-27
            • 2011-04-30
            • 2012-09-18
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多