使用webbrowser控件 javascript调用C++ 实现流程,这里面涉及到了自动化对象,即IDispatch接口的实现,首先说下大概框架,否则初学者如我看了半天还是不太明白,这些类是如何在一起相互调用的:
现在说下IDispatch接口,该类是ImpDispatch其头文件如下:
// test.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" int _tmain(int argc, _TCHAR* argv[]) { return 0; } #pragma once class ImpDispatch:public IDispatch { public: ImpDispatch(void); ~ImpDispatch(void); ULONG m_Ref; public: //IUnknown接口的实现 virtual HRESULT STDMETHODCALLTYPE QueryInterface( /* [in] */ REFIID riid, /* [iid_is][out] */ __RPC__deref_out void __RPC_FAR *__RPC_FAR *ppvObject) { if(riid==IID_IUnknown) { *ppvObject=(IUnknown*)this; return S_OK; } else if(riid==IID_IDispatch) { *ppvObject=(IDispatch*)this; return S_OK; } return E_FAIL; } virtual ULONG STDMETHODCALLTYPE AddRef( void) { m_Ref++; return m_Ref; } virtual ULONG STDMETHODCALLTYPE Release( void) { m_Ref--; return m_Ref; } //IDispatch接口的实现 virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount( /* [out] */ __RPC__out UINT *pctinfo) { return E_FAIL;; } virtual HRESULT STDMETHODCALLTYPE GetTypeInfo( /* [in] */ UINT iTInfo, /* [in] */ LCID lcid, /* [out] */ __RPC__deref_out_opt ITypeInfo **ppTInfo) { return E_FAIL; } virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames( /* [in] */ __RPC__in REFIID riid, /* [size_is][in] */ __RPC__in_ecount_full(cNames) LPOLESTR *rgszNames, /* [range][in] */ __RPC__in_range(0,16384) UINT cNames, /* [in] */ LCID lcid, /* [size_is][out] */ __RPC__out_ecount_full(cNames) DISPID *rgDispId) { rgDispId[0]=100; return S_OK; } virtual /* [local] */ HRESULT STDMETHODCALLTYPE Invoke( /* [in] */ DISPID dispIdMember, /* [in] */ REFIID riid, /* [in] */ LCID lcid, /* [in] */ WORD wFlags, /* [out][in] */ DISPPARAMS *pDispParams, /* [out] */ VARIANT *pVarResult, /* [out] */ EXCEPINFO *pExcepInfo, /* [out] */ UINT *puArgErr) { if(dispIdMember==100) { MessageBox(NULL,L"这是C++调用的结果",L"提示",0); } 我们需要注意的是如果是有参数传递的话,加入是两个整数,则应该这样读取!!!!! int val1=pDispParams->rgvarg[0].intVal; int val2=pDispParams->rgvarg[1].intVal; return S_OK; } };
当然其cpp文件如下:
#include "StdAfx.h" #include "ImpDispatch.h" ImpDispatch::ImpDispatch(void) { m_Ref=0; } ImpDispatch::~ImpDispatch(void) { }
接下来是与站点建立连接的类,即继承COleControlSite,实现GetExternal,从而与IDispatch建立连接
该类暂定为SiteCtrl,其头文件如下:
#pragma once #include <mshtmhst.h> #include"ImpDispatch.h" class SiteCtrl: public COleControlSite { public: ImpDispatch* pImp; public: ~SiteCtrl(void); SiteCtrl(COleControlContainer*pCtrl):COleControlSite(pCtrl) { pImp=new ImpDispatch(); } BEGIN_INTERFACE_PART(DocHostUIHandler,IDocHostUIHandler) virtual HRESULT STDMETHODCALLTYPE ShowContextMenu( /* [in] */ DWORD dwID, /* [in] */ POINT *ppt, /* [in] */ IUnknown *pcmdtReserved, /* [in] */ IDispatch *pdispReserved) ; virtual HRESULT STDMETHODCALLTYPE GetHostInfo( /* [out][in] */ DOCHOSTUIINFO *pInfo) ; virtual HRESULT STDMETHODCALLTYPE ShowUI( /* [in] */ DWORD dwID, /* [in] */ IOleInPlaceActiveObject *pActiveObject, /* [in] */ IOleCommandTarget *pCommandTarget, /* [in] */ IOleInPlaceFrame *pFrame, /* [in] */ IOleInPlaceUIWindow *pDoc) ; virtual HRESULT STDMETHODCALLTYPE HideUI( void); virtual HRESULT STDMETHODCALLTYPE UpdateUI( void); virtual HRESULT STDMETHODCALLTYPE EnableModeless( /* [in] */ BOOL fEnable) ; virtual HRESULT STDMETHODCALLTYPE OnDocWindowActivate( /* [in] */ BOOL fActivate) ; virtual HRESULT STDMETHODCALLTYPE OnFrameWindowActivate( /* [in] */ BOOL fActivate); virtual HRESULT STDMETHODCALLTYPE ResizeBorder( /* [in] */ LPCRECT prcBorder, /* [in] */ IOleInPlaceUIWindow *pUIWindow, /* [in] */ BOOL fRameWindow); virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator( /* [in] */ LPMSG lpMsg, /* [in] */ const GUID *pguidCmdGroup, /* [in] */ DWORD nCmdID) ; virtual HRESULT STDMETHODCALLTYPE GetOptionKeyPath( /* [annotation][out] */ __out LPOLESTR *pchKey, /* [in] */ DWORD dw) ; virtual HRESULT STDMETHODCALLTYPE GetDropTarget( /* [in] */ IDropTarget *pDropTarget, /* [out] */ IDropTarget **ppDropTarget); virtual HRESULT STDMETHODCALLTYPE GetExternal( /* [out] */ IDispatch **ppDispatch) ; virtual HRESULT STDMETHODCALLTYPE TranslateUrl( /* [in] */ DWORD dwTranslate, /* [annotation][in] */ __in __nullterminated OLECHAR *pchURLIn, /* [annotation][out] */ __out OLECHAR **ppchURLOut) ; virtual HRESULT STDMETHODCALLTYPE FilterDataObject( /* [in] */ IDataObject *pDO, /* [out] */ IDataObject **ppDORet); END_INTERFACE_PART(DocHostUIHandler); DECLARE_INTERFACE_MAP(); };