2013-06-24 2 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); 

мой метод аварии плагин провер. 1 из 6 звонков. Описание исключения: Необработанное исключение в 0x7572969b в chrome.exe: исключение Microsoft C++: utf8 :: invalid_utf16 в ячейке памяти. Я попытался изменить возвращаемый тип моего метода из FB :: variant в std :: wstring, но это не помогло.

Что я сделал не так? Как мне вернуть двоичную строку? Преобразование двоичной строки в base64 или другие изменения в возвращаемой строке мне не подходит.

ответ

2

Если вы хотите передать это как строку в JavaScript, вам действительно нужно использовать CAPICOM_ENCODE_BASE64 - иначе значения в этом буфере могут быть любыми, включая значения вне пространства символов. Некоторый код явно проверяет это, вызывая свое исключение.

Если вам нужно использовать это внутренне в своем плагине, не используйте строки, например, например. a 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 и декодировать его на массив чисел? –