方案一:
// 利用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" οnclick= "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 οnclick= "CallCpp()" >JavaScript访问C++代码</button>

...

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

// 实现IDispatch 接口
InBlock.gif // .h
InBlock.gif class 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.gif class CCustomControlSite: public COleControlSite
InBlock.gif{
InBlock.gif public:
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.gif class CCustomOccManager : public COccManager
InBlock.gif{
InBlock.gif public:
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.gif class CImpIDispatch;
InBlock.gif class 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}