对浏览器中的ActiveX控件如何交互不太懂。
举个例子吧。假设有2个ActiveX控件,其中一个控件A可以源源不断得到一些信息,比如说描述圆,矩形,多边形等图形的数据,然后这个控件要调用控件B的接口来画出圆,矩形,多边形。就是说控件A就管接受信息,是不可见的,控件B就管显示出来。但是控件A怎么得到在同一页面的控件B实例的接口,并调用这个接口绘图呢?始终没有想太明白。
 在vc中当然是很好解决的了,很容易得到控件B的接口,但是在浏览器中怎么做,希望诸位大侠指点,本菜鸟对浏览器实在不懂

解决方案 »

  1.   

    可以考虑从控件A发出一个事件到浏览器,由浏览器的脚本(javascript)响应该事件再调用B控件。
    这里面需要你编写脚本来粘合这两者。
      

  2.   

    另一种方式是通过控件A的控件站点访问HTML文档,枚举文档中的ActiveX控件
    void CICWXPlayerCtrl::SetHolderID(CICWXPlayerWindowHolder::enumHolderIndex iHolderIndex,LPCTSTR lpszElementID)
    {
    IOleClientSite* pClientSite=GetClientSite(); 
    do{
    if(pClientSite==NULL)break;
    CComQIPtr pISP(pClientSite);
    if(pISP==NULL)break;
    CComPtr pIWebBrowser2;
    pISP->QueryService(IID_IWebBrowserApp, IID_IWebBrowser2,
    (void **)&pIWebBrowser2);
    if(pIWebBrowser2==NULL)break;
    CComPtr spDocument;
    pIWebBrowser2->get_Document(&spDocument);
    CComQIPtr pIHTMLDocument2(spDocument);
    if(pIHTMLDocument2==NULL)break;
    CComPtr pHTMLElementCollection;
    pIHTMLDocument2->get_all(&pHTMLElementCollection);
    if(pHTMLElementCollection==NULL)break;
    COleVariant varName(lpszElementID,VT_BSTR);
    COleVariant varindex;CComPtr spElement;
    pHTMLElementCollection->item(varName,varindex,&spElement);
    if(spElement==NULL)break;
    //is it an Iframe?
    CComQIPtr pFrame(spElement);
    if(pFrame){
    switch(iHolderIndex){
    case CICWXPlayerWindowHolder::WebHolder:
    case CICWXPlayerWindowHolder::TextHolder:
    m_holders[iHolderIndex].SetTarget(spElement);
    break;
    }
    }
    CComQIPtr pObjectElement(spElement);
    if(pObjectElement==NULL)break;
    CComPtr spObject;
    pObjectElement->get_object(&spObject); 
    m_holders[iHolderIndex].SetTarget(spObject);
    }
    while(FALSE);
    }
      

  3.   

    方法一也是可以的,不过我要的是第二种。
    感谢蒋老大。这样一来就比较有趣了,假设控件B不停的接受服务器发来的信息,然后在B上画出来,不就成了CS模式而不是BS模式了,这倒挺有意思的,到底是什么模式也搞不清楚了。