【问题标题】:converting BSTR to a BYTE array C++将 BSTR 转换为 BYTE 数组 C++
【发布时间】:2017-10-14 03:19:01
【问题描述】:

我需要从“BSTR”创建一个“SAFEARRAY 字节”以将其传递给函数。

我尝试了以下方法从 BSTR 创建 BYTE*。

有没有其他方法可以将 BSTR 转换为 BYTE* 而不会导致任何数据丢失?

BSTR bstr = SysAllocString(L"This is a basic string which encoded in UTF-16!!ɏ");
int len = WideCharToMultiByte(CP_UTF8, 0, bstr, -1, NULL, 0, NULL, NULL);
BYTE *pByte = new BYTE[len];

if (len > 0)
{
    /*
    for(int i=0; i<len; i++)
    {
        pByte[i] = (BYTE) bstr[i]; //using this way may lead to lose data.
    }
    */
    WideCharToMultiByte(CP_UTF8, 0, bstr, -1, (LPSTR)&pByte[0], len, NULL, NULL);
    //cout << "Byte Array: " << pByte << endl;
}

delete []pByte;

【问题讨论】:

  • 第二个WideCharToMultiByte 调用有什么问题?一个完整的、具体的失败示例会很有帮助。
  • 您的代码与SAFEARRAY 无关。 BSTR 是安全的。我猜您只是想将 UTF-16 转换为 UTF-8。错误的 Unicode 转换会导致数据丢失。你不需要BSTR。将SysFreeString 放在SysAllocString 之后进行清理

标签: c++ winapi bstr


【解决方案1】:

SAFEARRAYBSTR 都是 ActiveX/COM 自动化类型。 BSTR 是官方字符串类型,那么为什么任何 COM/Automation 函数都希望将字符串作为字节的 SAFEARRAY 而不是 BSTR?即使这样,也可以通过BSTR 使用SysAllocStringByteLen() 而不是SAFEARRAY 传递原始字节。

现在,要回答您的问题,只需使用SafeArrayCreate() 创建字节数组,然后您可以随意填充它。例如:

BSTR bstr = SysAllocString(L"This is a basic string which encoded in UTF-16!!ɏ");
int len = WideCharToMultiByte(CP_UTF8, 0, bstr, -1, NULL, 0, NULL, NULL);
SAFEARRAYBOUND bound;
bound.cElements = len;
bound.lLbound = 0;
SAFEARRAY *sa = SafeArrayCreate(VT_U1, 1, &bound);
if (len > 0) {
    char *data;
    SafeArrayAccessData(sa, (void**)&data);
    WideCharToMultiByte(CP_UTF8, 0, bstr, -1, data, len, NULL, NULL);
    //cout << "Byte Array: " << data << endl;
    SafeArrayUnaccessData(sa);
}
SafeArrayDestroy(sa);
SysFreeString(bstr) ;

【讨论】:

    猜你喜欢
    • 2023-03-14
    • 2015-07-30
    • 1970-01-01
    • 2018-08-31
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2020-02-03
    • 2012-05-18
    相关资源
    最近更新 更多