0

我有一段从 CAPICOM.Utilities 获取随机二进制字符串的代码。

m_pUtilities.CreateInstance(__uuidof(Utilities));
_bstr_t bstrResult;
m_pUtilities->raw_GetRandom(64, CAPICOM_ENCODE_BINARY, bstrResult.GetAddress());

我做了一个返回的方法

return std::wstring(bstrResult);

我的方法使插件应用程序崩溃。6 个电话中的 1 个。异常描述为 Unhandled exception at 0x7572969b in chrome.exe: Microsoft C++ exception: utf8::invalid_utf16 at memory location。我试图将我的方法的返回类型从 FB::variant 更改为 std::wstring,但这没有帮助。

我做错了什么?我应该如何返回二进制字符串?将二进制字符串转换为 base64 或返回字符串的其他更改不适合我。

4

1 回答 1

2

如果您想将其作为字符串传递给 JavaScript,您确实需要使用CAPICOM_ENCODE_BASE64- 否则此缓冲区中的值可以是任何值,包括字符空间之外的值。一些代码显然会对此进行检查,从而导致您的异常。

如果您只需要在插件内部使用它,请不要使用字符串,而是使用 astd::vector<WCHAR>或仅使用BSTR.

旁注:在这种情况下没关系,但BSTRs 是长度前缀,并且BSTRs 和std::wstrings 都可以包含嵌入0的 s - 所以要正确,你真的必须 return std::wstring(bstr.GetBSTR(), bstr.length())

于 2013-06-24T21:52:57.497 回答