C++ MFC WebBrowser 探索(二)

使用webbrowser控件 javascript调用C++ 实现流程,这里面涉及到了自动化对象,即IDispatch接口的实现,首先说下大概框架,否则初学者如我看了半天还是不太明白,这些类是如何在一起相互调用的:

165738_0KUE_1398794.png

现在说下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();  
          
};


转载于:https://my.oschina.net/shou1156226/blog/526584

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值