C++ 当从线程调用时,为什么IHTMLImgElement方法put_src返回E_OUTOFMEMORY?

C++ 当从线程调用时,为什么IHTMLImgElement方法put_src返回E_OUTOFMEMORY?,c++,multithreading,internet-explorer,bho,ihtmlimgelement,C++,Multithreading,Internet Explorer,Bho,Ihtmlimgelement,我有一个BHO(InternetExplorer扩展),我正试图将“data:image/png;base64[code]”(base64编码的图像缓冲区)设置为IHTMLImgElement的src。当从BHO的主线程调用put_src时,没有问题,但是现在我从另一个线程调用它,它返回E_OUTOFMEMORY。base64编码的字符串非常长。对于较短的base64字符串,它不返回任何错误 我必须指定我没有内存泄漏,我只使用了智能COM指针,并删除了所有分配的内存 我还使用相同类型的base6

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

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

我还使用相同类型的base64字符串调用IHTMLStyle对象的set_backgroundImage,它不返回任何错误

“非线程安全”的具体含义是什么?正如我在报纸上写的那样 main post调用set_backgroundImage返回时没有问题

在这种情况下,它只是意味着除了创建BHO的主线程之外,您不能直接从任何其他线程调用它。如果需要从其他线程使用它,请将对象的
IHTMLImgElement
接口封送到该线程,例如使用

更多信息:


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

MSHTML文档对象及其DOM API不是线程安全的。它必须在创建它的同一线程上调用,也就是在创建BHO的同一线程上调用。谢谢您的回答。“非线程安全”的具体含义是什么?正如我在主要帖子中所写的,set_backgroundImage的调用返回时没有问题。我使用GIT(全局接口表)封送和解封IWebBrowser2对象,因此,据我所知,它应该可以正常工作。我使用GIT(全局接口表)封送和解封送IWebBrowser2对象。@evilwhalboy,显示用于通过GIT封送WebBrowser/MSHTML COM对象的代码。
HRESULT hr=CoCreateInstance(CLSID_stdglobalinterfacable,0,CLSCTX_INPROC_SERVER,IID_iglobalnterfacable,(void**)&pGIT);HRESULT hr=this->pGIT->registerinterfaceingglobal(\u pSite,IID\u IWebBrowser2,&this->dwCookie);CComPtr pSiteObj;hr=this->pGIT->GetInterfaceFromGlobal(this->dwCookie,IID_IWebBrowser2,(void**)和pSiteObj)@evilwhalboy,这看起来没问题。顺便问一下,您是否跨线程缓存了任何COM指针,比如指向
IHTMLDocument2
?很抱歉这个可能很愚蠢的问题,但是跨线程缓存指针意味着什么?