2013-06-24 30 views
0

我有一段从CAPICOM.Utilities获取随机二进制字符串的代码。Firebreath:二进制字符串返回值异常

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

我做了返回

return std::wstring(bstrResult); 

我的方法崩溃插件进近的方法。 6个电话中的1个。异常描述是 chrome.exe中的0x7572969b未处理的异常:Microsoft C++异常:内存位置为utf8 :: invalid_utf16。 我试图将我的方法的返回类型从FB :: variant更改为std :: wstring,但这没有帮助。

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

回答

2

如果您希望将此字符串作为字符串传递给JavaScript,您确实需要使用CAPICOM_ENCODE_BASE64 - 否则此缓冲区中的值可能为任何值,包括字符空间外的值。有些代码显然会检查这个,导致你的异常。

如果您只需要在插件内部使用它,请勿使用字符串,例如一个std::vector<WCHAR>或只使用BSTR

旁注:它不会在这种情况下无所谓,但BSTR s为前缀的长度和两个BSTR S和std::wstring S可包含嵌入0秒 - 所以是正确的,你真的不得不返回std::wstring(bstr.GetBSTR(), bstr.length())

+1

是的;你不能从npapi插件返回二进制字符串到浏览器,它只是不受支持。浏览器期望一个utf8编码的字符串 – taxilian

+0

不幸的是我需要从我的插件中传递这个值。可能我根本不会实现这个选项。 – Pisaren

+0

@Pisaren:技术上你可以用一个普通的值填充一个(JS)数组,然后返回它,但这会很慢。如何将它作为base64传递给JS并将其解码为数组数组? –

相关问题