我遇到的问题是:
在一个名为MyComTest的ActiveX控件中,有一属性(PropGet)MyParent,该属性返回值是一实现IElement(从IDispatch继承)的组件
我希望能在网页中通过脚本对MyParent访问,也就是:
var parentElement = MyComTest1.MyParent;
alert(parentElement.Name);由于不想在注册表中留下过多的记录,且IElement必须依存IMyComTest存立,因此不希望通过CoCreateInstanse实现。
我用ATL试过以下几种方法:
1、public CElement : ....,IDispachImpl(......){...}
   ...
   HRESULT CMyComTest::get_MyParent(LPIDISPATCH val)
   {
       // CComObject(CElement)* m_myParent 是CMyComTest的成员变量
       CComObject(CElement).CreateInstanse(&m_myParent);
       *val = &m_myParent;
   }
   使用该方法用alert(parentElement);测试时显示undefine,但在debug方式下,可以看到*val为有效值。
2、public CElement : IDispatch{自己实现IDispatch,IUnknown成员函数}
   ...
   HRESULT CMyComTest::get_MyParent(LPIDISPATCH val)
   {
       // CElement* m_myParent 是CMyComTest的成员变量
       m_myParent = new CElement;
       *val = &m_myParent;
   }
   使用该方法用alert(parentElement);测试时出现非法访问错误,但在debug方式下,可以看到*val为有效值。不知各位大侠能否赐教?

解决方案 »

  1.   

    首先接口参数错误,应该是 LPIDISPATCH* val,即 IDispatch** val不能通过 *val = &m_myParent; 直接赋值,必须要查询接口。CComObject<CElement> pElement = NULL;
    CComObject<CElement>::CreateInstance(&pElement);
    pElement->QueryInterface(IID_IDispatch, (LPVOID*)val);
      

  2.   

    应该不行
    建议看看COM+技术大全
      

  3.   

    同意 iLdf(七伤拳) ,直接赋值容易引起引用计数混乱,另外最好使用智能指针
      

  4.   

    如果你显示给出组件的路劲的话, 与DLL的区别就很小了