我有一段代码,它从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或返回字符串中的其他更改不适合我。
如果你想将其作为字符串传递给JavaScript,你真的需要使用CAPICOM_ENCODE_BASE64
——否则这个缓冲区中的值可以是任何值,包括字符空间之外的值。某些代码显然会对此进行检查,从而导致异常。
如果你只需要在插件内部使用它,不要使用字符串,而是使用std::vector<WCHAR>
或只使用BSTR
。
附带说明:在这种情况下,这无关紧要,但BSTR
s是以长度为前缀的,BSTR
s和std::wstring
s都可以包含嵌入的0
s,因此为了正确起见,您确实必须返回std::wstring(bstr.GetBSTR(), bstr.length())
。