在主线程中调用
CoMarshalInterThreadInterfaceInStream( IID_IHTMLWindow2,(LPUNKNOWN)pWin,&g_pStream );
如果在这里接着调用
IStream* pStream;
hr = g_pStream->Clone(&pStream);
IHTMLWindow2Ptr pWin1;
HRESULT hr = CoGetInterfaceAndReleaseStream( pStream,IID_IHTMLWindow2,(void**)&pWin1 );
能正确取得 IHTMLWindow2 接口但,如果在其他线程中调用
IHTMLWindow2Ptr pWin;
HRESULT hr = CoGetInterfaceAndReleaseStream( g_pStream,IID_IHTMLWindow2,(void**)&pWin );
得到“没有此接口”错误
========================
请问这是什么原因,如何解决?另外,IHTMLDocument2 接口可以用这种方法 跨线程调用,偏偏 IHTMLWindow2 就不行。搞不懂,请指教

解决方案 »

  1.   

    我的应用场合是:
    ATL 写了一个 COM 组件,此组件用于 IE 客户端交互
    组件提供属性 Window,用于接收来自 网页 的代码设置 window 对象,大概使用方法是:
    <script language="javascript">
       var JsCaller = new ActiveXObject("WebObj.JsCaller");
       JsCaller.Document = document;
       JsCaller.Window = window;
    </script>
    调用
    JsCaller.Window = window;
    时,保存 IHTMLWindow2 接口,供其他线程执行 script 用
      

  2.   

    连 IHTMLElement 元素的接口都可以保存,就是 IHTMLWindow2 接口不行。
    即使得到 document,再从 document->get_parentWindow 仍然提示无接口
      

  3.   

    知道问题所在了,IHTMLWindow2 不能在 MTA 线程中使用,所以在MTA线程中总是得到 E_NOINTERFACE
    但我的线程是 RPC 返回线程,是MTA类型,不能更改的,真麻烦!