描述:
看了http://expert.csdn.net/Expert/topic/2595/2595151.xml?temp=.8259088一文
根据lop大侠的说法:
需要先查看类型库以了解DocumentComplete是哪个接口的成员方法,然后向这个实例请求IConnectionPointContainer指针,然后通过其成员函数FindConnectionPoint(可能记错),参数输入DocumentComplete所在的接口的IID,以获得IConnectionPoint指针,再调用IConnectionPoint::Advise将自己编写的一个类的实例的指针传入即可。
上面的自己编写的类必须支持DocumentComplete所在的接口,这可通过类型库信息获得其具体类型信息,再进行实现。实现时如果不关心的事件,可以不实现,但仍必须简单的返回一个错误代码。在实现的DocumentComplete成员函数中做楼主想作的事即可。
我在一个对话框中放了一个按钮,在按钮的响应事件中写了如下语句:
void CCccDlg::OnButtonAdvise()
{
// TODO: Add your control notification handler code here
CComPtr<IWebBrowser2> m_wndBrowser;
HRESULT hr = m_wndBrowser.CoCreateInstance
(OLESTR"InternetExplorer.Application"));
IConnectionPointContainer *pCPC;
IConnectionPoint *pCP;
//向这个实例请求IConnectionPointContainer指针
hr = m_wndBrowser->QueryInterface(IID_IConnectionPointContainer,
(void **)&pCPC);
//获得IConnectionPoint指针
hr = pCPC->FindConnectionPoint(DIID_DWebBrowserEvents2,&pCP);
//we have done with the connection point container interface
pCPC->Release();
IUnknown *pSinkUnk;
CIEEvent *pSink;
pSink = new CIEEvent;
//Get the pointer to CSink's IUnknown pointer
hr = pSink->QueryInterface (IID_IUnknown,(void **)&pSinkUnk);
DWORD dwAdvise;
hr = pCP->Advise(pSinkUnk,&dwAdvise);
m_wndBrowser->Navigate(BSTR("www.sina.com.cn"),NULL,NULL,NULL,NULL);
pCP->Unadvise(dwAdvise);
pCP->Release();
return ;
}
这是模拟着写的,不知道是否应该这样就能实现呢
CIEEvent是我自己定义的类
DocumentComplete在DWebBrowserEvents2中定义,所以我对CIEEvent的定义如下:
class CIEEvent : public DWebBrowserEvents2 //_IWebBrowser2//IUnknown//DWebBrowserEvents2
{
private:
DWORD m_dwRefCount;
public:
CIEEvent();
virtual ~CIEEvent();
DECLARE_CONNECTION_MAP()
virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void **ppvObject);
virtual ULONG STDMETHODCALLTYPE AddRef();
virtual ULONG STDMETHODCALLTYPE Release();
virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT __RPC_FAR *pctinfo);
virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo,LCID lcid,ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo);
virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid,LPOLESTR __RPC_FAR *rgszNames,UINT cNames,LCID lcid,DISPID __RPC_FAR *rgDispId);
virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember,REFIID riid,LCID lcid,WORD wFlags,DISPPARAMS __RPC_FAR *pDispParams,VARIANT __RPC_FAR *pVarResult,EXCEPINFO __RPC_FAR *pExcepInfo,UINT __RPC_FAR *puArgErr);
//start DWebBrowserEvents2 interface
virtual void STDMETHODCALLTYPE BeforeNavigate2(IDispatch* pDisp,VARIANT* URL,VARIANT* Flags,VARIANT* TargetFrameName,VARIANT* PostData,VARIANT* Headers,VARIANT_BOOL* Cancel);
virtual void STDMETHODCALLTYPE ClientToHostWindow(long *CX, long *CY);
virtual void STDMETHODCALLTYPE CommandStateChange(long Command,VARIANT_BOOL Enable);
virtual void STDMETHODCALLTYPE DocumentComplete(IDispatch* pDisp,VARIANT * URL);
virtual void STDMETHODCALLTYPE DownloadBegin(void);
virtual void STDMETHODCALLTYPE DownloadComplete(void);
virtual void STDMETHODCALLTYPE NavigateComplete2(IDispatch *pDisp, VARIANT *URL);
virtual void STDMETHODCALLTYPE NewWindow2(IDispatch** ppDisp,VARIANT_BOOL * Cancel);
virtual void STDMETHODCALLTYPE OnFullScreen(VARIANT_BOOL FullScreen);
virtual void STDMETHODCALLTYPE OnMenuBar(VARIANT_BOOL MenuBar);
virtual void STDMETHODCALLTYPE OnQuit(void);
virtual void STDMETHODCALLTYPE OnStatusBar(VARIANT_BOOL StatusBar);
virtual void STDMETHODCALLTYPE OnTheaterMode(VARIANT_BOOL TheaterMode);
virtual void STDMETHODCALLTYPE OnToolBar(VARIANT_BOOL ToolBar);
virtual void STDMETHODCALLTYPE OnVisible(VARIANT_BOOL Visible);
virtual void STDMETHODCALLTYPE ProgressChange(long Progress,long ProgressMax);
virtual void STDMETHODCALLTYPE PropertyChange(BSTR szProperty);
virtual void STDMETHODCALLTYPE StatusTextChange(BSTR bstrText);
virtual void STDMETHODCALLTYPE TitleChange(BSTR Text);
virtual void STDMETHODCALLTYPE WindowClosing(VARIANT_BOOL IsChildWindow, VARIANT_BOOL *Cancel);
virtual void STDMETHODCALLTYPE WindowSetHeight(long Height);
virtual void STDMETHODCALLTYPE WindowSetLeft(long Left);
virtual void STDMETHODCALLTYPE WindowSetResizable(VARIANT_BOOL Resizable);
virtual void STDMETHODCALLTYPE WindowSetTop(long Top);
virtual void STDMETHODCALLTYPE WindowSetWidth(long Width);
//end DWebBrowserEvents2 interface
};
然后在对应的cpp文件中具体实现这些函数,不知道这是不是能完成您所说的实现documentcomplete所在的所有接口。
其中开始我只加了DWebBrowserEvents2 interface的部分,后来编译不过去,就加了QueryInterface,AddRef,release,GetTypeInfoCount等的定义,但是加上了后,这部分编译过去了
然后又报错:QueryInterface' : cannot access protected member
QueryInterface,AddRef,release都是模拟着别人写的如下:
HRESULT STDMETHODCALLTYPE CIEEvent::QueryInterface(REFIID iid, void **ppvObject)
{
*ppvObject = NULL;
if (iid == DIID_DWebBrowserEvents2)
{