【问题标题】:Firebreath: binary string return value exceptionFirebreath:二进制字符串返回值异常
【发布时间】:2023-03-18 05:18:01
【问题描述】:

我有一段从 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 个。异常描述是 chrome.exe 中 0x7572969b 处未处理的异常:Microsoft C++ 异常:内存位置的 utf8::invalid_utf16。 我试图将我的方法的返回类型从 FB::variant 更改为 std::wstring,但这没有帮助。

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

【问题讨论】:

    标签: npapi firebreath browser-plugin


    【解决方案1】:

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

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

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

    【讨论】:

    • 是的;您不能将二进制字符串从 npapi 插件返回到浏览器,它只是不受支持。浏览器需要一个 utf8 编码的字符串
    • 不幸的是,我需要将此值从我的插件中传递出去。可能我根本不会实现这个选项。
    • @Pisaren:从技术上讲,您可以用普通值填充(JS)数组并返回它,但这会非常慢。将它作为 base64 传递给 JS 并在那里解码为一个数字数组怎么样?
    • @GeorgFritzsche:我想实现由输入参数定义的不同返回类型(二进制或base64字符串),所以现在我将只返回base64字符串。
    猜你喜欢
    • 2019-02-02
    • 1970-01-01
    • 1970-01-01
    • 2023-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    相关资源
    最近更新 更多