为什么 IHTMLImgElement 方法put_src从线程调用时返回E_OUTOFMEMORY

Why does IHTMLImgElement method put_src returns E_OUTOFMEMORY when called from thread?

本文关键字:调用 返回 OUTOFMEMORY 线程 IHTMLImgElement 方法 put src 为什么      更新时间:2023-10-16

我有一个BHO(Internet Explorer扩展),我正在尝试设置一个"data:image/png;base64,[code]"(base64编码图像缓冲区)作为IHTMLImgElement的src。当从 BHO 的主线程调用 put_src 时,没有问题,但现在我从不同的线程调用它,它返回E_OUTOFMEMORY。base64 编码的字符串很长。对于较短的 base64 字符串,它不会返回任何错误。

必须指定我没有内存泄漏,我只使用了智能COM指针,并删除了所有分配的内存。

此外,我使用相同类型的base64字符串为IHTMLStyle对象调用set_backgroundImage,并且它没有返回任何错误。

"不安全"的具体含义是什么?正如我在 主要发布呼叫set_backgroundImage返回没有问题。

在这种情况下,它

只是意味着您不能直接从任何其他线程调用它,而是创建 BHO 的主线程。如果您需要从另一个线程使用它,请将对象的IHTMLImgElement接口封送到该线程,例如使用 CoMarshalInterThreadInterfaceInStream .

更多信息:

  • 如何在可视C++中跨公寓封送界面

  • OLE 线程模型的描述和工作原理

如果将 IWebBrowser2 对象封送到另一个线程,则传递给put_src方法的字符串必须是使用 SysAllocString 分配的 BSTR,而不是简单的 LPWSTR。 我从另一个论坛得到了答案。