Почему метод 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,

Больше информации:

Другие вопросы по тегам