2013-06-24 8 views
0

CAPICOM.Utilities에서 임의의 이진 문자열을 가져 오는 코드 조각이 있습니다. Firebreath : 이진 문자열 반환 값 예외

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

나는 appr 플러그인

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의 길이는 접두사이고 두 BSTR들과 std::wstring0의 임베디드 포함 할 수 - 그래서 당신은 정말 std::wstring(bstr.GetBSTR(), bstr.length())을 반환해야 정확합니다.

+1

예. npapi 플러그인에서 브라우저로 이진 문자열을 반환 할 수는 없습니다. 지원되지 않습니다. 브라우저는 utf8로 인코딩 된 문자열을 기대합니다. – taxilian

+0

불행히도이 값을 내 플러그인에서 전달해야합니다. 아마도이 옵션을 전혀 구현하지 않을 것입니다. – Pisaren

+0

@ 피셔 : 기술적으로 (JS) 배열을 일반 값으로 채우고 반환 할 수는 있지만 매우 느립니다. JS로 base64로 전달하고 번호 배열로 디코딩하는 방법은? –