使用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();
};