【问题标题】:convert BSTR to const char* [duplicate]将 BSTR 转换为 const char* [重复]
【发布时间】:2011-05-17 04:27:44
【问题描述】:

【问题讨论】:

    标签: c++


    【解决方案1】:
    typedef OLECHAR FAR * BSTR;
    typedef WCHAR  OLECHAR;
    

    来自here

    WCHAR*。这是一个宽字符,而不是字符。这意味着它是 Unicode,而不是 ASCII,不应该被转换。如果要使用 const char*,请不要使用宽类型。

    虽然可以使用一些黑客技术,但您可能会丢失数据,因为您要将文本从 Unicode 转换为 ASCII。

    【讨论】:

    • 窄字符串不必是 ASCII。它们可能是 UTF-8,在这种情况下,您仍然可以显示通常被认为是宽的字符,例如中文和日文。
    • 某些函数没有 ASCII 版本。例如Graphics::DrawStringmsdn.microsoft.com/en-us/library/ms535991(VS.85).aspx
    【解决方案2】:

    BSTR 实际上是带有长度前缀的WCHAR*BSTR 值指向字符串的开头,而不是长度前缀(存储在 BSTR 指向的位置“之前”的字节中)。

    换句话说,您可以将BSTR 视为const WCHAR*。无需转换。

    所以您的问题实际上是:“如何将 Unicode 字符串 (WCHAR*) 转换为 char*?”答案是使用::WideCharToMultiByte API 函数,如here 所述。或者,如果您在应用程序中使用 MFC/ATL,请使用 ATL and MFC Conversion Macros

    【讨论】:

      【解决方案3】:
      #include "comutil.h"
      
      BSTR bstrVal;
      _bstr_t interim(bstrVal, false);    
          // or use true to get original BSTR released through wrapper
      const char* strValue((const char*) bstrVal);
      

      This 处理所有宽字符到多字节的转换。

      【讨论】:

        猜你喜欢
        • 2011-04-08
        • 2013-07-24
        • 2011-01-06
        • 1970-01-01
        • 1970-01-01
        • 2010-10-11
        • 1970-01-01
        • 2022-01-10
        • 2011-12-27
        相关资源
        最近更新 更多