不好意思问个问题,有关获得COM组件事件的。我在程序中动态的生成一个ie浏览器实例,不是用的微软浏览器控件,而是如此:
CComPtr<IWebBrowser2> iebrowser;
....
CoInitialize(NULL);
HRESULT hr = iebrowser.CoCreateInstance(OLESTR("InternetExplorer.Application"));
if(FAILED(hr))
{
AfxMessageBox("cocreate iebrowser error");
return -1;
}
....
iebrowser->Navigate("www.sina.com.cn",...)
....
可是我怎么获得这个实例的事件呢?如调用Navigate方法后,页面下载完毕后的DocumentComplete事件。如果对ie浏览器不熟的话,那就一般的这种情况动态生成COM组件实例,如何获得该组件的事件呢?
谢谢!!!

解决方案 »

  1.   

    需要先查看类型库以了解DocumentComplete是哪个接口的成员方法,然后向这个实例请求IConnectionPointContainer指针,然后通过其成员函数FindConnectionPoint(可能记错),参数输入DocumentComplete所在的接口的IID,以获得IConnectionPoint指针,再调用IConnectionPoint::Advise将自己编写的一个类的实例的指针传入即可。上面的自己编写的类必须支持DocumentComplete所在的接口,这可通过类型库信息获得其具体类型信息,再进行实现。实现时如果不关心的事件,可以不实现,但仍必须简单的返回一个错误代码。在实现的DocumentComplete成员函数中做楼主想作的事即可。
      

  2.   

    谢谢!我去试试,不过不是很明白具体细节如何,可否有部分代码参考一下。多谢lop5712(LOP)
      

  3.   

    我帮楼主查看了一下MSDN,对于MFC,由于"InternetExplorer.Application"是控件,使用MFC将更容易一些。用CWnd::CreateControl创建它,传入"InternetExplorer.Application",并传入父窗口指针,在父窗口的实现类中,比如CMainFrame中,在头文件中使用DECLARE_EVENTSINK_MAP宏,在源文件中使用BEGIN_EVENTSINK_MAP和END_EVENTSINK_MAP宏及ON_EVENT来插入事件处理函数的映射关系(那几个宏的用法请查看MSDN),再在对应的成员函数中处理欲处理的事件即可。
    这样做我上面说的步骤MFC已经实现了,所以这样将简单得多。
    如下:
    // .h
    class CXXX : CWnd
    {
        DECLARE_EVENTSINK_MAP
    };// .cpp
    BEGIN_EVENTSINK_MAP( CXXX, CWnd )
        ON_EVENT( ... )
    END_EVENTSINK_MAP()对于ATL,我还没查过,晚些时候再来发贴
      

  4.   

    对于CreateControl的使用,可以大致参考http://expert.csdn.net/Expert/topic/2594/2594899.xml?temp=.354336
      

  5.   

    回去帮楼主查了一下MSDN,对于ATL,只需简单的从IDispEventImpl(或IDispEventSimpleImpl)下派生一个类,再添加BEGIN_SINK_MAP和END_SINK_MAP及SINK_ENTRY宏以添加事件和成员函数的映射关系,具体用法楼主可参考MSDN.在派生类的成员函数中处理楼主希望的事件即可.
      

  6.   

    各位大侠,能否再说的具体点呢
    原码该如何实现等等还有LOP大侠说的“实现时如果不关心的事件,可以不实现,但仍必须简单的返回一个错误代码”是什么意思呢
      

  7.   

    to zxlark(努力中) 
        对于“实现时如果不关心的事件,可以不实现,但仍必须简单的返回一个错误代码”,因为事件接口也是一个接口,不过实现的是客户端而已,因此客户端必须实现接口里面所有的方法,如果客户端并不想响应所有的事件,也就是说不想实现事件接口中的所有方法,但由于是接口,必须全部实现,所以不想实现的接口也需要实现,不过用一个简单的return即可,一般返回return E_NOTIMPL;(可能记错)
        而上面说的使用各种宏,都是针对事件接口(也称做出接口)是IDispatch派生接口的特例,ActiveX控件基本上都是使用IDispatch做为出接口的。对于使用IDispatch的出接口,关于代码具体怎么实现,并且是MFC的实现方式,我在下面的帖子中给出过一个简单的例子,你可以参考一下
    http://expert.csdn.net/Expert/topic/2611/2611741.xml?temp=.9318811
      

  8.   

    lop大侠有空能否帮我看看我的问题
    http://expert.csdn.net/Expert/topic/2634/2634720.xml?temp=.4706995
    谢谢了