我有一段代码从CAPICOM.Utilities获取随机二进制字符串。
m_pUtilities.CreateInstance(__uuidof(Utilities));
_bstr_t bstrResult;
m_pUtilities->raw_GetRandom(64, CAPICOM_ENCODE_BINARY, bstrResult.GetAddress());
我做了一个返回
的方法return std::wstring(bstrResult);
我的方法崩溃了插件appr。 6个电话中的1个。例外描述是 chrome.exe中0x7572969b处的未处理异常:Microsoft C ++异常:内存位置的utf8 :: invalid_utf16 。 我试图将我的方法的返回类型从FB :: variant更改为std :: wstring,但这并没有帮助。
我做错了什么?我该如何返回二进制字符串?将二进制字符串转换为base64或返回字符串中的其他更改不适合我。
答案 0 :(得分:2)
如果要将此字符串作为字符串传递给JavaScript,则确实需要使用CAPICOM_ENCODE_BASE64
- 否则此缓冲区中的值可能是任何值,包括字符空间外的值。有些代码显然会检查这一点,导致您的异常。
如果您只需要在插件内部使用此功能,请不要使用字符串,例如std::vector<WCHAR>
或仅使用BSTR
。
旁注:在这种情况下无关紧要,但BSTR
的长度为前缀,BSTR
和std::wstring
都可以包含嵌入0
s - 所以要正确,你真的必须返回std::wstring(bstr.GetBSTR(), bstr.length())
。