Почему метод IHTMLImgElement put_src возвращает E_OUTOFMEMORY при вызове из потока?
У меня есть BHO(расширение Internet Explorer), и я пытаюсь установить "data:image/png;base64, [code]" (буфер кодированных изображений base64) в качестве источника IHTMLImgElement. Когда put_src вызывался из основного потока BHO, проблем не было, но теперь, когда я вызываю его из другого потока, он возвращает E_OUTOFMEMORY. Строка в кодировке base64 очень длинная. Для более короткой строки base64 ошибка не возвращается.
Я должен указать, что у меня нет утечек памяти, я использовал только умные COM-указатели и удалил всю выделенную память.
Также я использую тот же тип строки base64 для вызова set_backgroundImage для объектов IHTMLStyle, и он не возвращает ошибку.
2 ответа
Если объект IWebBrowser2 маршалируется в другой поток, строка, передаваемая методу put_src, должна быть BSTR, выделенным с помощью SysAllocString, а не простым LPWSTR. Я получил ответ с другого форума.
Что конкретно означает "не защищенный поток"? Как я писал в основном посте, вызов set_backgroundImage возвращается без проблем.
В этом контексте это просто означает, что вы не можете вызывать его напрямую из любого другого потока, кроме основного потока, в котором был создан ваш BHO. Если вам нужно использовать его из другого потока, выполните маршализацию объекта. IHTMLImgElement
интерфейс к этой теме, например, с CoMarshalInterThreadInterfaceInStream
,
Больше информации: