方案一:
// 利用webbrowser 控件
// C++: 响应 的 webbrowser 消息函数OnBeforeNavigat2 
virtual void OnBeforeNavigate2( LPCTSTR lpszURL, DWORD nFlags, LPCTSTR lpszTargetFrameName, 
CByteArray& baPostedData, LPCTSTR lpszHeaders, BOOL* pbCancel );
 
// html & JavaScript code following

InBlock.gif...
InBlock.gif
<button value="Click me" onclick="window.navigate('app:command&arg1=1&arg2=2')" />
InBlock.gif
...
// C++ code following
InBlock.gifCXXXDlg::OnBeforeNavigate2( LPCTSTR lpszURL, DWORD nFlags, LPCTSTR lpszTargetFrameName,
InBlock.gif     CByteArray& baPostedData, LPCTSTR lpszHeaders, BOOL* pbCancel )
InBlock.gif{
InBlock.gif    CString strUrl = lpszURL;
InBlock.gif    if(strUrl.Left(4) == _T("app:"))
InBlock.gif    {
InBlock.gif        // cancel the common url navigate and call your c++ code here
InBlock.gif        *pbCancel = TURE;
InBlock.gif        // call other c++ function here or parse the argument in the strUrl
InBlock.gif        
InBlock.gif    }
InBlock.gif    // go common url navigate here
InBlock.gif    
InBlock.gif}

方案二:
// 改写MFC程序的 Control Container
// html & javaScript following
...

function CallCpp()

{

alert('start to call cpp here');

window.external.JavaScriptCallCpp('This is a test for call C++ in JavaScript');

}

<button onclick="CallCpp()" >JavaScript访问C++代码</button>

...

// C++ code following
InBlock.gifCString javaScriptName = _T("JavaScriptCallCpp");
InBlock.gif
#define DISPID_CallCppFromJs 1

// 实现IDispatch 接口
InBlock.gif// .h
InBlock.gifclass CImpIDispatch : public IDispatch
InBlock.gif{
InBlock.gif        protected:
InBlock.gif                ULONG                             m_cRef;
InBlock.gif
        public:
InBlock.gif                CImpIDispatch(void);
InBlock.gif                ~CImpIDispatch(void);
InBlock.gif
                STDMETHODIMP QueryInterface(REFIID, void **);
InBlock.gif                STDMETHODIMP_(ULONG) AddRef(void);
InBlock.gif                STDMETHODIMP_(ULONG) Release(void);
InBlock.gif
                //IDispatch
InBlock.gif                STDMETHODIMP GetTypeInfoCount(UINT* pctinfo);
InBlock.gif                STDMETHODIMP GetTypeInfo(/* [in] */ UINT iTInfo,
InBlock.gif                        /* [in] */ LCID lcid,
InBlock.gif                        /* [out] */ ITypeInfo** ppTInfo);
InBlock.gif                STDMETHODIMP GetIDsOfNames(
InBlock.gif                        /* [in] */ REFIID riid,
InBlock.gif                        /* [size_is][in] */ LPOLESTR *rgszNames,
InBlock.gif                        /* [in] */ UINT cNames,
InBlock.gif                        /* [in] */ LCID lcid,
InBlock.gif                        /* [size_is][out] */ DISPID *rgDispId);
InBlock.gif                STDMETHODIMP Invoke(
InBlock.gif                        /* [in] */ DISPID dispIdMember,
InBlock.gif                        /* [in] */ REFIID riid,
InBlock.gif                        /* [in] */ LCID lcid,
InBlock.gif                        /* [in] */ WORD wFlags,
InBlock.gif                        /* [out][in] */ DISPPARAMS    *pDispParams,
InBlock.gif                        /* [out] */ VARIANT    *pVarResult,
InBlock.gif                        /* [out] */ EXCEPINFO *pExcepInfo,
InBlock.gif                        /* [out] */ UINT *puArgErr);
InBlock.gif
};
InBlock.gif
// .cpp
InBlock.gifSTDMETHODIMP CImpIDispatch::QueryInterface( REFIID riid, void **ppv )
InBlock.gif{
InBlock.gif        *ppv = NULL;
InBlock.gif

InBlock.gif        if ( IID_IDispatch == riid )
InBlock.gif        {
InBlock.gif                *ppv = this;
InBlock.gif        }
InBlock.gif        
InBlock.gif        if ( NULL != *ppv )
InBlock.gif        {
InBlock.gif                ((LPUNKNOWN)*ppv)->AddRef();
InBlock.gif                return NOERROR;
InBlock.gif        }
InBlock.gif
        return E_NOINTERFACE;
InBlock.gif}
InBlock.gif

InBlock.gifSTDMETHODIMP_(ULONG) CImpIDispatch::AddRef(void)
InBlock.gif{
InBlock.gif        return ++m_cRef;
InBlock.gif}
InBlock.gif
STDMETHODIMP_(ULONG) CImpIDispatch::Release(void)
InBlock.gif{
InBlock.gif        return --m_cRef;
InBlock.gif}
InBlock.gif

InBlock.gif//IDispatch
InBlock.gifSTDMETHODIMP CImpIDispatch::GetTypeInfoCount(UINT* /*pctinfo*/)
InBlock.gif{
InBlock.gif        return E_NOTIMPL;
InBlock.gif}
InBlock.gif
STDMETHODIMP CImpIDispatch::GetTypeInfo(
InBlock.gif                        /* [in] */ UINT /*iTInfo*/,
InBlock.gif                        /* [in] */ LCID /*lcid*/,
InBlock.gif                        /* [out] */ ITypeInfo** /*ppTInfo*/)
InBlock.gif{
InBlock.gif        return E_NOTIMPL;
InBlock.gif}
InBlock.gif
STDMETHODIMP CImpIDispatch::GetIDsOfNames(
InBlock.gif                        /* [in] */ REFIID riid,
InBlock.gif                        /* [size_is][in] */ OLECHAR** rgszNames,
InBlock.gif                        /* [in] */ UINT cNames,
InBlock.gif                        /* [in] */ LCID lcid,
InBlock.gif                        /* [size_is][out] */ DISPID* rgDispId)
InBlock.gif{
InBlock.gif        HRESULT hr;
InBlock.gif        UINT        i;
InBlock.gif
        // Assume some degree of success
InBlock.gif        hr = NOERROR;
InBlock.gif

InBlock.gif                for ( i=0; i < cNames; i++) {
InBlock.gif                CString cszName    = rgszNames[i];
InBlock.gif                                if (cszName == javaScriptName)
InBlock.gif                {
InBlock.gif                        rgDispId[i] = DISPID_CallCppFromJs;
InBlock.gif                }
InBlock.gif                else {
InBlock.gif                        // One or more are unknown so set the return code accordingly
InBlock.gif                        hr = ResultFromScode(DISP_E_UNKNOWNNAME);
InBlock.gif                        rgDispId[i] = DISPID_UNKNOWN;
InBlock.gif                }
InBlock.gif        }
InBlock.gif        return hr;
InBlock.gif}
InBlock.gif
STDMETHODIMP CImpIDispatch::Invoke(
InBlock.gif                        /* [in] */ DISPID dispIdMember,
InBlock.gif                        /* [in] */ REFIID /*riid*/,
InBlock.gif                        /* [in] */ LCID /*lcid*/,
InBlock.gif                        /* [in] */ WORD wFlags,
InBlock.gif                        /* [out][in] */ DISPPARAMS* pDispParams,
InBlock.gif                        /* [out] */ VARIANT* pVarResult,
InBlock.gif                        /* [out] */ EXCEPINFO* /*pExcepInfo*/,
InBlock.gif                        /* [out] */ UINT* puArgErr)
InBlock.gif{
InBlock.gif
        CXXXDlg* pDlg = (CCppCallJsDlg*) AfxGetMainWnd();
InBlock.gif        
InBlock.gif        if (dispIdMember == DISPID_CallCppFromJs)
InBlock.gif        {
InBlock.gif                if (wFlags & DISPATCH_PROPERTYGET)
InBlock.gif                {
InBlock.gif                        if (pVarResult != NULL)
InBlock.gif                        {
InBlock.gif                                VariantInit(pVarResult);
InBlock.gif                                V_VT(pVarResult)=VT_BOOL;
InBlock.gif                                V_BOOL(pVarResult)=true;
InBlock.gif                        }
InBlock.gif                }
InBlock.gif
                if (wFlags & DISPATCH_METHOD)
InBlock.gif                {
InBlock.gif                        CString cszArg1= pDispParams->rgvarg[0].bstrVal;
InBlock.gif                        pDlg->CallByScript(cszArg1);
InBlock.gif                }
InBlock.gif        }
InBlock.gif
        return S_OK;
InBlock.gif}
// 改写COleControlSit
InBlock.gif// .h
InBlock.gifclass CCustomControlSite:public COleControlSite
InBlock.gif{
InBlock.gifpublic:
InBlock.gif        CCustomControlSite(COleControlContainer *pCnt):COleControlSite(pCnt){}
InBlock.gif
        
InBlock.gifBEGIN_INTERFACE_PART(DocHostShowUI, IDocHostShowUI)
InBlock.gif                INIT_INTERFACE_PART(CDocHostSite, DocHostShowUI)
InBlock.gif                STDMETHOD(ShowHelp)(
InBlock.gif                        /* [in ] */        HWND hwnd,
InBlock.gif                        /* [in ] */        LPOLESTR pszHelpFile,
InBlock.gif                        /* [in ] */        UINT uCommand,
InBlock.gif                        /* [in ] */        DWORD dwData,
InBlock.gif                        /* [in ] */        POINT ptMouse,
InBlock.gif                        /* [out] */        IDispatch __RPC_FAR *pDispatchObjectHit);
InBlock.gif                STDMETHOD(ShowMessage)(
InBlock.gif                        /* [in ] */        HWND hwnd,
InBlock.gif                        /* [in ] */        LPOLESTR lpstrText,
InBlock.gif                        /* [in ] */        LPOLESTR lpstrCaption,
InBlock.gif                        /* [in ] */        DWORD dwType,
InBlock.gif                        /* [in ] */        LPOLESTR lpstrHelpFile,
InBlock.gif                        /* [in ] */        DWORD dwHelpContext,
InBlock.gif                        /* [out] */        LRESULT __RPC_FAR *plResult);
InBlock.gif        END_INTERFACE_PART(DocHostShowUI)
InBlock.gif
protected:
InBlock.gif
        DECLARE_INTERFACE_MAP();
InBlock.gifBEGIN_INTERFACE_PART(DocHostUIHandler, IDocHostUIHandler)
InBlock.gif        STDMETHOD(ShowContextMenu)(/* [in] */ DWORD dwID,
InBlock.gif                        /* [in] */ POINT __RPC_FAR *ppt,
InBlock.gif                        /* [in] */ IUnknown __RPC_FAR *pcmdtReserved,
InBlock.gif                        /* [in] */ IDispatch __RPC_FAR *pdispReserved);
InBlock.gif        STDMETHOD(GetHostInfo)(
InBlock.gif                        /* [out][in] */ DOCHOSTUIINFO __RPC_FAR *pInfo);
InBlock.gif        STDMETHOD(ShowUI)(
InBlock.gif                        /* [in] */ DWORD dwID,
InBlock.gif                        /* [in] */ IOleInPlaceActiveObject __RPC_FAR *pActiveObject,
InBlock.gif                        /* [in] */ IOleCommandTarget __RPC_FAR *pCommandTarget,
InBlock.gif                        /* [in] */ IOleInPlaceFrame __RPC_FAR *pFrame,
InBlock.gif                        /* [in] */ IOleInPlaceUIWindow __RPC_FAR *pDoc);
InBlock.gif        STDMETHOD(HideUI)(void);
InBlock.gif        STDMETHOD(UpdateUI)(void);
InBlock.gif        STDMETHOD(EnableModeless)(/* [in] */ BOOL fEnable);
InBlock.gif        STDMETHOD(OnDocWindowActivate)(/* [in] */ BOOL fEnable);
InBlock.gif        STDMETHOD(OnFrameWindowActivate)(/* [in] */ BOOL fEnable);
InBlock.gif        STDMETHOD(ResizeBorder)(
InBlock.gif                        /* [in] */ LPCRECT prcBorder,
InBlock.gif                        /* [in] */ IOleInPlaceUIWindow __RPC_FAR *pUIWindow,
InBlock.gif                        /* [in] */ BOOL fRameWindow);
InBlock.gif        STDMETHOD(TranslateAccelerator)(
InBlock.gif                        /* [in] */ LPMSG lpMsg,
InBlock.gif                        /* [in] */ const GUID __RPC_FAR *pguidCmdGroup,
InBlock.gif                        /* [in] */ DWORD nCmdID);
InBlock.gif        STDMETHOD(GetOptionKeyPath)(
InBlock.gif                        /* [out] */ LPOLESTR __RPC_FAR *pchKey,
InBlock.gif                        /* [in] */ DWORD dw);
InBlock.gif        STDMETHOD(GetDropTarget)(
InBlock.gif                        /* [in] */ IDropTarget __RPC_FAR *pDropTarget,
InBlock.gif                        /* [out] */ IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget);
InBlock.gif        STDMETHOD(GetExternal)(
InBlock.gif                        /* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch);
InBlock.gif        STDMETHOD(TranslateUrl)(
InBlock.gif                        /* [in] */ DWORD dwTranslate,
InBlock.gif                        /* [in] */ OLECHAR __RPC_FAR *pchURLIn,
InBlock.gif                        /* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut);
InBlock.gif        STDMETHOD(FilterDataObject)(
InBlock.gif                        /* [in] */ IDataObject __RPC_FAR *pDO,
InBlock.gif                        /* [out] */ IDataObject __RPC_FAR *__RPC_FAR *ppDORet);
InBlock.gifEND_INTERFACE_PART(DocHostUIHandler)
InBlock.gif};
InBlock.gif

InBlock.gifclass CCustomOccManager :public COccManager
InBlock.gif{
InBlock.gifpublic:
InBlock.gif        CCustomOccManager(){}
InBlock.gif        COleControlSite* CreateSite(COleControlContainer* pCtrlCont)
InBlock.gif        {
InBlock.gif                CCustomControlSite *pSite = new CCustomControlSite(pCtrlCont);
InBlock.gif                return pSite;
InBlock.gif        }
InBlock.gif};
InBlock.gif
// .cpp
InBlock.gif
BEGIN_INTERFACE_MAP(CCustomControlSite, COleControlSite)
InBlock.gif        INTERFACE_PART(CCustomControlSite, IID_IDocHostShowUI, DocHostShowUI)
InBlock.gif        INTERFACE_PART(CCustomControlSite, IID_IDocHostUIHandler, DocHostUIHandler)
InBlock.gifEND_INTERFACE_MAP()
InBlock.gif

InBlock.gifULONG CCustomControlSite::XDocHostShowUI::AddRef()
InBlock.gif{
InBlock.gif        METHOD_PROLOGUE(CCustomControlSite, DocHostShowUI);
InBlock.gif
        return pThis->ExternalAddRef();
InBlock.gif}
InBlock.gif
ULONG CCustomControlSite::XDocHostShowUI::Release()
InBlock.gif{
InBlock.gif        METHOD_PROLOGUE(CCustomControlSite, DocHostShowUI);
InBlock.gif
        return pThis->ExternalRelease();
InBlock.gif}
InBlock.gif
HRESULT CCustomControlSite::XDocHostShowUI::QueryInterface(REFIID riid, void ** ppvObj)
InBlock.gif{
InBlock.gif        METHOD_PROLOGUE(CCustomControlSite, DocHostShowUI);
InBlock.gif
        return pThis->ExternalQueryInterface( &riid, ppvObj );
InBlock.gif}
InBlock.gif

InBlock.gifHRESULT CCustomControlSite::XDocHostShowUI::ShowHelp(HWND hwnd,
InBlock.gif                                                                                             LPOLESTR pszHelpFile,
InBlock.gif                                                                                             UINT nCommand,
InBlock.gif                                                                                             DWORD dwData,
InBlock.gif                                                                                             POINT ptMouse,
InBlock.gif                                                                                             IDispatch * pDispatchObjectHit)
InBlock.gif{
InBlock.gif        METHOD_PROLOGUE(CCustomControlSite, DocHostShowUI);
InBlock.gif
        return S_OK;
InBlock.gif}
InBlock.gif
HRESULT CCustomControlSite::XDocHostShowUI::ShowMessage(HWND hwnd,
InBlock.gif                                                                                                    LPOLESTR lpstrText,
InBlock.gif                                                                                                    LPOLESTR lpstrCaption,
InBlock.gif                                                                                                    DWORD dwType,
InBlock.gif                                                                                                    LPOLESTR lpstrHelpFile,
InBlock.gif                                                                                                    DWORD dwHelpContext,
InBlock.gif                                                                                                    LRESULT * plResult)
InBlock.gif{
InBlock.gif        METHOD_PROLOGUE(CCustomControlSite, DocHostShowUI);
InBlock.gif        
InBlock.gif        MessageBox(hwnd, (CString)lpstrText, _T("Cpp & JavaScript"), /*dwType*/MB_ICONWARNING);
InBlock.gif
        return S_OK;
InBlock.gif}
InBlock.gif

InBlock.gifULONG FAR EXPORT    CCustomControlSite::XDocHostUIHandler::AddRef()
InBlock.gif{
InBlock.gif        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
InBlock.gif        return pThis->ExternalAddRef();
InBlock.gif}
InBlock.gif

InBlock.gifULONG FAR EXPORT    CCustomControlSite::XDocHostUIHandler::Release()
InBlock.gif{                                                        
InBlock.gif        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
InBlock.gif        return pThis->ExternalRelease();
InBlock.gif}
InBlock.gif
HRESULT FAR EXPORT    CCustomControlSite::XDocHostUIHandler::QueryInterface(REFIID riid, void **ppvObj)
InBlock.gif{
InBlock.gif        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
InBlock.gif        HRESULT hr = (HRESULT)pThis->ExternalQueryInterface(&riid, ppvObj);
InBlock.gif        return hr;
InBlock.gif}
InBlock.gif
// * CImpIDocHostUIHandler::GetHostInfo
InBlock.gif// *
InBlock.gif// * Purpose: Called at initialization
InBlock.gif// *
InBlock.gifHRESULT FAR EXPORT    CCustomControlSite::XDocHostUIHandler::GetHostInfo( DOCHOSTUIINFO* pInfo )
InBlock.gif{
InBlock.gif
        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
InBlock.gif        pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER;
InBlock.gif        pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT;
InBlock.gif
        return S_OK;
InBlock.gif}
InBlock.gif
// * CImpIDocHostUIHandler::ShowUI
InBlock.gif// *
InBlock.gif// * Purpose: Called when MSHTML.DLL shows its UI
InBlock.gif// *
InBlock.gifHRESULT FAR EXPORT    CCustomControlSite::XDocHostUIHandler::ShowUI(
InBlock.gif                                DWORD dwID,
InBlock.gif                                IOleInPlaceActiveObject * /*pActiveObject*/,
InBlock.gif                                IOleCommandTarget * pCommandTarget,
InBlock.gif                                IOleInPlaceFrame * /*pFrame*/,
InBlock.gif                                IOleInPlaceUIWindow * /*pDoc*/)
InBlock.gif{
InBlock.gif
        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
InBlock.gif        // We've already got our own UI in place so just return S_OK
InBlock.gif        return S_OK;
InBlock.gif}
InBlock.gif
// * CImpIDocHostUIHandler::HideUI
InBlock.gif// *
InBlock.gif// * Purpose: Called when MSHTML.DLL hides its UI
InBlock.gif// *
InBlock.gifHRESULT FAR EXPORT    CCustomControlSite::XDocHostUIHandler::HideUI(void)
InBlock.gif{
InBlock.gif        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
InBlock.gif        return S_OK;
InBlock.gif}
InBlock.gif
// * CImpIDocHostUIHandler::UpdateUI
InBlock.gif// *
InBlock.gif// * Purpose: Called when MSHTML.DLL updates its UI
InBlock.gif// *
InBlock.gifHRESULT FAR EXPORT    CCustomControlSite::XDocHostUIHandler::UpdateUI(void)
InBlock.gif{
InBlock.gif        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
InBlock.gif        // MFC is pretty good about updating it's UI in it's Idle loop so I don't do anything here
InBlock.gif        return S_OK;
InBlock.gif}
InBlock.gif
// * CImpIDocHostUIHandler::EnableModeless
InBlock.gif// *
InBlock.gif// * Purpose: Called from MSHTML.DLL's IOleInPlaceActiveObject::EnableModeless
InBlock.gif// *
InBlock.gifHRESULT FAR EXPORT    CCustomControlSite::XDocHostUIHandler::EnableModeless(BOOL /*fEnable*/)
InBlock.gif{
InBlock.gif        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
InBlock.gif        return E_NOTIMPL;
InBlock.gif}
InBlock.gif
// * CImpIDocHostUIHandler::OnDocWindowActivate
InBlock.gif// *
InBlock.gif// * Purpose: Called from MSHTML.DLL's IOleInPlaceActiveObject::OnDocWindowActivate
InBlock.gif// *
InBlock.gifHRESULT FAR EXPORT    CCustomControlSite::XDocHostUIHandler::OnDocWindowActivate(BOOL /*fActivate*/)
InBlock.gif{
InBlock.gif        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
InBlock.gif        return E_NOTIMPL;
InBlock.gif}
InBlock.gif
// * CImpIDocHostUIHandler::OnFrameWindowActivate
InBlock.gif// *
InBlock.gif// * Purpose: Called from MSHTML.DLL's IOleInPlaceActiveObject::OnFrameWindowActivate
InBlock.gif// *
InBlock.gifHRESULT FAR EXPORT    CCustomControlSite::XDocHostUIHandler::OnFrameWindowActivate(BOOL /*fActivate*/)
InBlock.gif{
InBlock.gif        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
InBlock.gif        return E_NOTIMPL;
InBlock.gif}
InBlock.gif
// * CImpIDocHostUIHandler::ResizeBorder
InBlock.gif// *
InBlock.gif// * Purpose: Called from MSHTML.DLL's IOleInPlaceActiveObject::ResizeBorder
InBlock.gif// *
InBlock.gifHRESULT FAR EXPORT    CCustomControlSite::XDocHostUIHandler::ResizeBorder(
InBlock.gif                                LPCRECT /*prcBorder*/,
InBlock.gif                                IOleInPlaceUIWindow* /*pUIWindow*/,
InBlock.gif                                BOOL /*fRameWindow*/)
InBlock.gif{
InBlock.gif        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
InBlock.gif        return E_NOTIMPL;
InBlock.gif}
InBlock.gif
// * CImpIDocHostUIHandler::ShowContextMenu
InBlock.gif// *
InBlock.gif// * Purpose: Called when MSHTML.DLL would normally display its context menu
InBlock.gif// *
InBlock.gifHRESULT FAR EXPORT    CCustomControlSite::XDocHostUIHandler::ShowContextMenu(
InBlock.gif                                DWORD /*dwID*/,
InBlock.gif                                POINT* pptPosition,
InBlock.gif                                IUnknown* /*pCommandTarget*/,
InBlock.gif                                IDispatch* /*pDispatchObjectHit*/)
InBlock.gif{
InBlock.gif        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
InBlock.gif        return E_NOTIMPL;
InBlock.gif}
InBlock.gif
// * CImpIDocHostUIHandler::TranslateAccelerator
InBlock.gif// *
InBlock.gif// * Purpose: Called from MSHTML.DLL's TranslateAccelerator routines
InBlock.gif// *
InBlock.gifHRESULT FAR EXPORT    CCustomControlSite::XDocHostUIHandler::TranslateAccelerator(LPMSG lpMsg,
InBlock.gif                        /* [in] */ const GUID __RPC_FAR *pguidCmdGroup,
InBlock.gif                        /* [in] */ DWORD nCmdID)
InBlock.gif{
InBlock.gif        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
InBlock.gif                
InBlock.gif                //disable F5
InBlock.gif                if(lpMsg->message == WM_KEYDOWN && GetAsyncKeyState(VK_F5) < 0)
InBlock.gif                        return S_OK;
InBlock.gif
                if(GetKeyState(VK_CONTROL) & 0x8000)
InBlock.gif                {
InBlock.gif                        //disable ctrl + O
InBlock.gif                        if(lpMsg->message == WM_KEYDOWN && GetAsyncKeyState(0x4F) < 0)
InBlock.gif                                return S_OK;
InBlock.gif                        //disable ctrl + p
InBlock.gif                        if(lpMsg->message == WM_KEYDOWN && GetAsyncKeyState(0x50) < 0)
InBlock.gif                                return S_OK;
InBlock.gif                        //disable ctrl + N
InBlock.gif                        if(lpMsg->message == WM_KEYDOWN && GetAsyncKeyState(0x4E) < 0)
InBlock.gif                                return S_OK;
InBlock.gif                }
InBlock.gif
                //disable back space
InBlock.gif                if(lpMsg->wParam == VK_BACK)
InBlock.gif                        return S_OK;
InBlock.gif
        return S_FALSE;
InBlock.gif}
InBlock.gif
// * CImpIDocHostUIHandler::GetOptionKeyPath
InBlock.gif// *
InBlock.gif// * Purpose: Called by MSHTML.DLL to find where the host wishes to store
InBlock.gif// *        its options in the registry
InBlock.gif// *
InBlock.gifHRESULT FAR EXPORT    CCustomControlSite::XDocHostUIHandler::GetOptionKeyPath(BSTR* pbstrKey, DWORD)
InBlock.gif{
InBlock.gif
        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
InBlock.gif        return E_NOTIMPL;
InBlock.gif}
InBlock.gif
STDMETHODIMP CCustomControlSite::XDocHostUIHandler::GetDropTarget(
InBlock.gif                        /* [in] */ IDropTarget __RPC_FAR *pDropTarget,
InBlock.gif                        /* [out] */ IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget)
InBlock.gif{
InBlock.gif        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
InBlock.gif        return E_NOTIMPL;
InBlock.gif}
InBlock.gif

InBlock.gifSTDMETHODIMP CCustomControlSite::XDocHostUIHandler::GetExternal(
InBlock.gif                        /* [out] */ IDispatch __RPC_FAR *__RPC_FAR *ppDispatch)
InBlock.gif{
InBlock.gif        // return the IDispatch we have for extending the object Model
InBlock.gif        IDispatch* pDisp = (IDispatch*)theApp.m_pDispOM;
InBlock.gif        pDisp->AddRef();
InBlock.gif        *ppDispatch = pDisp;
InBlock.gif        return S_OK;
InBlock.gif}
InBlock.gif                
InBlock.gifSTDMETHODIMP CCustomControlSite::XDocHostUIHandler::TranslateUrl(
InBlock.gif                        /* [in] */ DWORD dwTranslate,
InBlock.gif                        /* [in] */ OLECHAR __RPC_FAR *pchURLIn,
InBlock.gif                        /* [out] */ OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut)
InBlock.gif{
InBlock.gif        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
InBlock.gif        return E_NOTIMPL;
InBlock.gif}
InBlock.gif                
InBlock.gifSTDMETHODIMP CCustomControlSite::XDocHostUIHandler::FilterDataObject(
InBlock.gif                        /* [in] */ IDataObject __RPC_FAR *pDO,
InBlock.gif                        /* [out] */ IDataObject __RPC_FAR *__RPC_FAR *ppDORet)
InBlock.gif{
InBlock.gif        METHOD_PROLOGUE(CCustomControlSite, DocHostUIHandler)
InBlock.gif        return E_NOTIMPL;
InBlock.gif}

// 修改App
InBlock.gif// .h
InBlock.gifclass CImpIDispatch;
InBlock.gifclass CXXXApp : public CWinApp
InBlock.gif{
InBlock.gif    
InBlock.gif    CImpIDispatch        *m_pDispOM;
InBlock.gif    
InBlock.gif}
InBlock.gif
// .cpp
InBlock.gifBOOL CXXXApp::InitInstance()
InBlock.gif{
InBlock.gif    
InBlock.gif        CWinApp::InitInstance();
InBlock.gif
        CCustomOccManager *pMgr = new CCustomOccManager;
InBlock.gif        // Create an IDispatch class for extending the Dynamic HTML Object Model
InBlock.gif        m_pDispOM = new CImpIDispatch;
InBlock.gif        // Set our control containment up but using our control container
InBlock.gif        // management class instead of MFC's default
InBlock.gif        AfxEnableControlContainer(pMgr);
InBlock.gif    
InBlock.gif}