本文只是简单交互 ,js调用 c++本地程序没有传参  想多了解请看 文末借鉴网址。

​​​​​ CXWebBrowser 文件下载地址:  https://download.csdn.net/download/li13641064384/13622485     free  下面也粘贴了

 CXWebBrowser *m_pWeb;
c++  调用  js  伪代码
BOOL CDlg::OnInitDialog(){TCHAR exeFullPath[MAX_PATH];TCHAR Dr[MAX_PATH];TCHAR Dpath[MAX_PATH];TCHAR File1[MAX_PATH];TCHAR File2[MAX_PATH];GetModuleFileName(NULL,exeFullPath, MAX_PATH);CString szfolder = exeFullPath;wsplitpath_s(exeFullPath,Dr,Dpath,File1,File2);     //将名称按盘符、目录、文件名拆分  wcscat_s(Dr,Dpath);     //合并盘符、目录   CString   strPath(Dr);  OleInitialize(NULL);m_pWeb = NULL;m_pWeb = new CXWebBrowser;m_pWeb->Initialize(GetSafeHwnd()); //  http://extjs.org.cn/fatjames/archives/476m_sURL =  strPath + CString("test.html");m_pWeb->OpenUrl(m_sURL .GetBuffer());AfxEnableControlContainer();
}void CDlg::OnBnClickedButton1()
{// TODO: 在此添加控件通知处理程序代码if (m_pWeb->m_bDocumentComplete)  // 判断是否加载完成{CComPtr<IHTMLDocument2> spDoc = m_pWeb->GetHTMLDocument2(); CComDispatchDriver spScript; spDoc->get_Script(&spScript); CComVariant var1 = 150, var2 = 250, varRet; spScript.Invoke2(L"Add", &var1, &var2, &varRet);   // 使用 InvokeN可以添加多个参数}
}
c++ 调用 js
实现这些接口  如果有需要 自选修改这几个函数
HRESULT CXWebBrowser::GetExternal(IDispatch **ppDispatch)
{*ppDispatch = this;   return S_OK;
}HRESULT CXWebBrowser::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
{//DISP ID            if(_tcscmp(rgszNames[0],_T("MyMethod")) == 0){*rgDispId = 200;         // 接口 id标识  invoke 要用return S_OK;}//  return __super::GetIDsOfNames(riid,rgszNames,cNames,lcid,rgDispId);return E_NOTIMPL;
}
HRESULT CXWebBrowser::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{if (!pDispParams)return E_INVALIDARG;switch (dispIdMember){case 200:MyMethod();break;case DISPID_WINDOWCLOSING:break;case DISPID_TITLECHANGE:break;case DISPID_NAVIGATEERROR:break;case DISPID_NAVIGATECOMPLETE:break;case DISPID_DOCUMENTCOMPLETE:       //  完成消息 完成后才可以调用  m_pWeb->GetHTMLDocument2();BSTR bstrUrl;m_pIWebBrowser2->get_LocationURL(&bstrUrl);m_strUrl = bstrUrl;m_bDocumentComplete = TRUE;break;}return E_NOTIMPL;
}void CXWebBrowser::MyMethod()
{CString str;str.Format(_T("%d"), 200);MessageBox(NULL,_T("js调用本地MyMethod方法,方法ID:")+ str, str, 1);
}
<!DOCTYPE html>
<html>
<head>
<title> tree</title><script type="text/javascript">function setUserInfo(userInfo) {  // qt版调用本地接口alert("我是 html 接口");   }function submitUserInfo() {  // qt版调用本地接口//alert("调用本地接口");var result = "1111111";MainWindow.submit_webcb(result);  }      function Add(value1, value2) { alert("我是 html add 接口");return value1 + value2; }   function MyMethod() {alert(11111111111111111);window.external.MyMethod();}    </script>
</head>
<body>
<form action="" onsubmit="submitUserInfo()">
<input type="submit" value="调用本地接口"/>
</form>
<form action="" onsubmit="MyMethod()">
<input type="submit" value="MyMethod"/>
</form>
</body>
</html>
// XWebBrowser.h: interface for the CXWebBrowser class.#ifndef   _INCLUDE_WEBBROWSEREX_FILE_H_
#define _INCLUDE_WEBBROWSEREX_FILE_H_
#pragma once
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <Windows.h>
#if _DEBUG
#include <crtdbg.h>//_ASSERT
#endif#include <oleidl.h>
#include <MsHTML.h>
#include <MSHTMHST.H>
#include <EXDISP.H>
#include <ExDispid.h>
#include <atlstr.h>/*
使用此类前务必调用OleInitialize,否则出错!
*/
enum _PAGE_ACT
{PAGE_GOBACK,   //后退PAGE_GOFORWARD, //前进PAGE_GOHOME,    //主页PAGE_SEARCH,    //搜索PAGE_REFRESH,   //刷新PAGE_STOP       //停止
};class CXWebBrowser://IE控件要继承这几个基类
public IDispatch,
public IOleClientSite,
public IOleInPlaceSite,
public IOleInPlaceFrame,
public IDocHostUIHandler
{
public:CXWebBrowser(void);~CXWebBrowser(void);
//
// 考虑到以后可能被继承/重载,所以写成虚的,但是本身也实现了
protected:
//IUnKnownvirtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject);virtual ULONG STDMETHODCALLTYPE AddRef(void);virtual ULONG STDMETHODCALLTYPE Release(void);
//IDispatchvirtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT *pctinfo);virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo);virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId);virtual HRESULT STDMETHODCALLTYPE Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr);
//IOleWindowvirtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *phwnd);virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode);
//IOleInPlaceUIWindowvirtual HRESULT STDMETHODCALLTYPE GetBorder(LPRECT lprectBorder);virtual HRESULT STDMETHODCALLTYPE RequestBorderSpace(LPCBORDERWIDTHS pborderwidths);virtual HRESULT STDMETHODCALLTYPE SetBorderSpace(LPCBORDERWIDTHS pborderwidths);virtual HRESULT STDMETHODCALLTYPE SetActiveObject(IOleInPlaceActiveObject *pActiveObject,LPCOLESTR pszObjName);
//IOleInPlaceFramevirtual HRESULT STDMETHODCALLTYPE InsertMenus(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths);virtual HRESULT STDMETHODCALLTYPE SetMenu(HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject);virtual HRESULT STDMETHODCALLTYPE RemoveMenus(HMENU hmenuShared);virtual HRESULT STDMETHODCALLTYPE SetStatusText(LPCOLESTR pszStatusText);virtual HRESULT STDMETHODCALLTYPE EnableModeless(BOOL fEnable);//返回0,则不相应回车消息,其他功能未知virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator(LPMSG lpmsg, WORD wID);
//IOleClientSitevirtual HRESULT STDMETHODCALLTYPE SaveObject(void);virtual HRESULT STDMETHODCALLTYPE GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk);virtual HRESULT STDMETHODCALLTYPE GetContainer(IOleContainer **ppContainer);virtual HRESULT STDMETHODCALLTYPE ShowObject(void);virtual HRESULT STDMETHODCALLTYPE OnShowWindow(BOOL fShow);virtual HRESULT STDMETHODCALLTYPE RequestNewObjectLayout(void);
//IDocHostUIHandler//返回0,则不弹出鼠标右键菜单,其他功能未知virtual HRESULT STDMETHODCALLTYPE ShowContextMenu(DWORD dwID, POINT *ppt, IUnknown *pcmdtReserved, IDispatch *pdispReserved);virtual HRESULT STDMETHODCALLTYPE GetHostInfo(DOCHOSTUIINFO *pInfo);virtual HRESULT STDMETHODCALLTYPE ShowUI(DWORD dwID, IOleInPlaceActiveObject *pActiveObject, IOleCommandTarget *pCommandTarget, IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc);virtual HRESULT STDMETHODCALLTYPE HideUI(void);virtual HRESULT STDMETHODCALLTYPE UpdateUI(void);
//  HRESULT STDMETHODCALLTYPE EnableModeless(BOOL fEnable);//重复了virtual HRESULT STDMETHODCALLTYPE OnDocWindowActivate(BOOL fActivate);virtual HRESULT STDMETHODCALLTYPE OnFrameWindowActivate(BOOL fActivate);virtual HRESULT STDMETHODCALLTYPE ResizeBorder(LPCRECT prcBorder, IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow);virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator(LPMSG lpMsg, const GUID *pguidCmdGroup, DWORD nCmdID);virtual HRESULT STDMETHODCALLTYPE GetOptionKeyPath(LPOLESTR *pchKey, DWORD dw);virtual HRESULT STDMETHODCALLTYPE GetDropTarget(IDropTarget *pDropTarget, IDropTarget **ppDropTarget);virtual HRESULT STDMETHODCALLTYPE GetExternal(IDispatch **ppDispatch);virtual HRESULT STDMETHODCALLTYPE TranslateUrl(DWORD dwTranslate, OLECHAR *pchURLIn, OLECHAR **ppchURLOut);virtual HRESULT STDMETHODCALLTYPE FilterDataObject(IDataObject *pDO, IDataObject **ppDORet);
//IOleInPlaceSitevirtual HRESULT STDMETHODCALLTYPE CanInPlaceActivate(void);virtual HRESULT STDMETHODCALLTYPE OnInPlaceActivate(void);virtual HRESULT STDMETHODCALLTYPE OnUIActivate(void);virtual HRESULT STDMETHODCALLTYPE GetWindowContext(IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo);virtual HRESULT STDMETHODCALLTYPE Scroll(SIZE scrollExtant);virtual HRESULT STDMETHODCALLTYPE OnUIDeactivate(BOOL fUndoable);virtual HRESULT STDMETHODCALLTYPE OnInPlaceDeactivate(void);virtual HRESULT STDMETHODCALLTYPE DiscardUndoState(void);virtual HRESULT STDMETHODCALLTYPE DeactivateAndUndo(void);virtual HRESULT STDMETHODCALLTYPE OnPosRectChange(LPCRECT lprcPosRect);private://内部私有变量CComPtr<IStorage> m_pStorage;               //存储根对象CComPtr<IOleObject> m_pObject;             //OLE对象CComPtr<IOleInPlaceObject> m_pInPlaceObj;  //InPlace对象CComPtr<IWebBrowser2> m_pIWebBrowser2;     //IWebBrowser2对象    HWND m_hDlg;                        //窗口容器BOOL m_bInPlaced;                 //是否替代???DWORD m_RefCount;                  //引用计数CComPtr<IOleInPlaceActiveObject> m_pInPlaceActiveObj;
public://公开外部可调用函数BOOL Initialize(IN HWND hDlg/*窗体句柄,IE控件的容器*/);HWND GetHwnd(void);CComPtr<IOleObject> GetIOleObject(void);CComPtr<IWebBrowser2> GetIWebBrowser2(void);CComPtr<IOleInPlaceObject> GetIOleInPlaceObject(void);CComPtr<IOleInPlaceActiveObject> GetIOleInPlaceActiveObject(void);virtual BOOL OpenUrl(IN PWCHAR pszUrl/*Unicode*/);virtual VOID DoPageAction(IN _PAGE_ACT eAct);/*以HTML代码形式显示网页(新网页)例如:<P>这是一个图片<P><IMG src="mypic.jpg">注:不需要<BODY></BODY>标签*/virtual BOOL PutHtmlCode(IN PWCHAR pszCode);virtual BOOL GetHtmlCode(OUT PWCHAR pszCode, IN OUT int *iszCount/*字符数*/);virtual BOOL ClickElementByID(PWCHAR pID);//根据控件ID设置值,用于自动填表virtual BOOL SetElementValueByID(IN PWCHAR pID, IN PWCHAR pszValue);//根据控件ID获取值virtual BOOL GetElementValueByID(IN PWCHAR pID, IN PWCHAR pszValue, IN OUT int *iszCount/*字符数*/);IHTMLDocument2* GetHTMLDocument2();  void GetZoomRange();void GetZoom();void ZoomIn();void ZoomOut();void SetZoom(WORD nZoom);void MyMethod();WORD m_wMinZoom;WORD m_wMaxZoom;WORD m_ulZoom;void Resize();CString m_strUrl;HWND m_hWndIPActiveObject;BOOL m_bDocumentComplete;
};#endif/*
目前无法实现快捷键的复制/粘贴等操作
解决方法之一是用CreateWindowEx创建窗体
在后面的GetMessage中做按键判断
再向WebBrowser发送命令粘贴命令:(参见OLECMDID枚举结构)
m_pIWebBrowser2->ExecWB(OLECMDID_PASTE, OLECMDEXECOPT_DODEFAULT, NULL, NULL);
*/
// XWebBrowser.cpp: implementation of the CXWebBrowser class.
// http://blog.csdn.net/Sidyhe
//
#include "StdAfx.h"
#include "XWebBrowser.h"
#include <MsHTML.h>//
// Construction/Destruction
//CXWebBrowser::CXWebBrowser()
{m_hWndIPActiveObject = 0;//初始化m_bInPlaced = FALSE;m_hDlg = NULL;m_RefCount = 0;m_pObject = NULL;m_pStorage = NULL;
#if _DEBUG//创建一个存储根对象_ASSERT(StgCreateDocfile(NULL, STGM_READWRITE|STGM_SHARE_EXCLUSIVE|STGM_DIRECT|STGM_CREATE, 0, &m_pStorage) == ERROR_SUCCESS);//创建OLE对象_ASSERT(OleCreate(CLSID_WebBrowser, IID_IOleObject, OLERENDER_DRAW, NULL, this/*万恶的继承*/, m_pStorage, (void**)&m_pObject) == ERROR_SUCCESS);_ASSERT(m_pObject->QueryInterface(IID_IOleInPlaceObject, (void**)&m_pInPlaceObj) == ERROR_SUCCESS);_ASSERT(m_pObject->QueryInterface(IID_IOleInPlaceActiveObject, (void**)&m_pInPlaceActiveObj) == ERROR_SUCCESS);_ASSERT(m_pObject->QueryInterface(IID_IWebBrowser2, (void**)&m_pIWebBrowser2) == ERROR_SUCCESS);
#elseStgCreateDocfile(NULL, STGM_READWRITE|STGM_SHARE_EXCLUSIVE|STGM_DIRECT|STGM_CREATE, 0, &m_pStorage);OleCreate(CLSID_WebBrowser, IID_IOleObject, OLERENDER_DRAW, NULL, this, m_pStorage, (void**)&m_pObject);m_pObject->QueryInterface(IID_IOleInPlaceObject, (void**)&m_pInPlaceObj);m_pObject->QueryInterface(IID_IOleInPlaceActiveObject, (void**)&m_pInPlaceActiveObj);m_pObject->QueryInterface(IID_IWebBrowser2, (void**)&m_pIWebBrowser2);
#endif
}CXWebBrowser::~CXWebBrowser()
{m_pObject->Close(OLECLOSE_NOSAVE);
}//IUnKnownHRESULT CXWebBrowser::QueryInterface(REFIID riid, void **ppvObject)
{//!!!*ppvObject = NULL;if (riid == IID_IOleClientSite) *ppvObject = (IOleClientSite*)this;if (riid == IID_IUnknown) *ppvObject = this;if (riid == IID_IDispatch) *ppvObject = (IDispatch*)this;if (!m_bInPlaced){if (riid == IID_IOleInPlaceSite) *ppvObject = (IOleInPlaceSite*)this;if (riid == IID_IOleInPlaceFrame) *ppvObject = (IOleInPlaceFrame*)this;if (riid == IID_IOleInPlaceUIWindow) *ppvObject = (IOleInPlaceUIWindow*)this;}if (riid == DIID_DWebBrowserEvents2) *ppvObject = (DWebBrowserEvents2*)this;if (riid == IID_IDocHostUIHandler) *ppvObject = (IDocHostUIHandler*)this;if (*ppvObject){AddRef();return ERROR_SUCCESS;}else{return E_NOINTERFACE;}
}ULONG CXWebBrowser::AddRef(void)
{InterlockedExchangeAdd((PLONG)&m_RefCount, 1);return ERROR_SUCCESS;
}ULONG CXWebBrowser::Release(void)
{
#if _DEBUGif (InterlockedExchangeAdd((PLONG)&m_RefCount, -1) == 0) _ASSERT(0);
#elseInterlockedExchangeAdd((PLONG)&m_RefCount, -1);
#endifreturn ERROR_SUCCESS;
}//IDispatchHRESULT CXWebBrowser::GetTypeInfoCount(UINT *pctinfo)
{return E_NOTIMPL;//貌似是不支持的意思
}HRESULT CXWebBrowser::GetTypeInfo(UINT iTInfo, LCID lcid, ITypeInfo **ppTInfo)
{return E_NOTIMPL;
}HRESULT CXWebBrowser::GetIDsOfNames(REFIID riid, LPOLESTR *rgszNames, UINT cNames, LCID lcid, DISPID *rgDispId)
{//DISP ID 从200开始if(_tcscmp(rgszNames[0],_T("MyMethod")) == 0){*rgDispId = 200;return S_OK;}//  return __super::GetIDsOfNames(riid,rgszNames,cNames,lcid,rgDispId);return E_NOTIMPL;
}HRESULT CXWebBrowser::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr)
{if (!pDispParams)return E_INVALIDARG;switch (dispIdMember){case 200:MyMethod();break;case DISPID_WINDOWCLOSING:break;case DISPID_TITLECHANGE:break;case DISPID_NAVIGATEERROR:break;case DISPID_NAVIGATECOMPLETE:break;case DISPID_DOCUMENTCOMPLETE:BSTR bstrUrl;m_pIWebBrowser2->get_LocationURL(&bstrUrl);m_strUrl = bstrUrl;m_bDocumentComplete = TRUE;break;}return E_NOTIMPL;
}//IOleWindowHRESULT CXWebBrowser::GetWindow(HWND *phwnd)
{*phwnd = m_hDlg;return ERROR_SUCCESS;
}HRESULT CXWebBrowser::ContextSensitiveHelp(BOOL fEnterMode)
{return E_NOTIMPL;
}//IOleInPlaceUIWindowHRESULT CXWebBrowser::GetBorder(LPRECT lprectBorder)
{GetClientRect(m_hDlg, lprectBorder);return ERROR_SUCCESS;
}HRESULT CXWebBrowser::RequestBorderSpace(LPCBORDERWIDTHS pborderwidths)
{return ERROR_SUCCESS;
}HRESULT CXWebBrowser::SetBorderSpace(LPCBORDERWIDTHS pborderwidths)
{return ERROR_SUCCESS;
}HRESULT CXWebBrowser::SetActiveObject(IOleInPlaceActiveObject *pActiveObject,LPCOLESTR pszObjName)
{if (pActiveObject){pActiveObject->GetWindow(&m_hWndIPActiveObject);}return ERROR_SUCCESS;
}//IOleInPlaceFrameHRESULT CXWebBrowser::InsertMenus(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths)
{return E_NOTIMPL;
}HRESULT CXWebBrowser::SetMenu(HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject)
{return E_NOTIMPL;
}HRESULT CXWebBrowser::RemoveMenus(HMENU hmenuShared)
{return E_NOTIMPL;
}HRESULT CXWebBrowser::SetStatusText(LPCOLESTR pszStatusText)
{return E_NOTIMPL;
}HRESULT CXWebBrowser::EnableModeless(BOOL fEnable)
{return E_NOTIMPL;
}HRESULT CXWebBrowser::TranslateAccelerator(LPMSG lpmsg, WORD wID)
{return TRUE;
}//IOleClientSiteHRESULT CXWebBrowser::SaveObject( void)
{return ERROR_SUCCESS;
}HRESULT CXWebBrowser::GetMoniker(DWORD dwAssign, DWORD dwWhichMoniker, IMoniker **ppmk)
{*ppmk = NULL;return E_NOTIMPL;
}HRESULT CXWebBrowser::GetContainer(IOleContainer **ppContainer)
{*ppContainer = NULL;return E_FAIL;
}HRESULT CXWebBrowser::ShowObject(void)
{return ERROR_SUCCESS;
}HRESULT CXWebBrowser::OnShowWindow(BOOL fShow)
{return ERROR_SUCCESS;
}HRESULT CXWebBrowser::RequestNewObjectLayout(void)
{return ERROR_SUCCESS;
}//IDocHostUIHandlerHRESULT CXWebBrowser::ShowContextMenu(DWORD dwID, POINT *ppt, IUnknown *pcmdtReserved, IDispatch *pdispReserved)
{return TRUE;
}HRESULT CXWebBrowser::GetHostInfo(DOCHOSTUIINFO *pInfo)
{return ERROR_SUCCESS;
}HRESULT CXWebBrowser::ShowUI(DWORD dwID, IOleInPlaceActiveObject *pActiveObject, IOleCommandTarget *pCommandTarget, IOleInPlaceFrame *pFrame, IOleInPlaceUIWindow *pDoc)
{return ERROR_SUCCESS;
}HRESULT CXWebBrowser::HideUI(void)
{return ERROR_SUCCESS;
}HRESULT CXWebBrowser::UpdateUI(void)
{return ERROR_SUCCESS;
}//EnableModeless重复了HRESULT CXWebBrowser::OnDocWindowActivate(BOOL fActivate)
{return ERROR_SUCCESS;
}HRESULT CXWebBrowser::OnFrameWindowActivate(BOOL fActivate)
{return ERROR_SUCCESS;
}HRESULT CXWebBrowser::ResizeBorder(LPCRECT prcBorder, IOleInPlaceUIWindow *pUIWindow, BOOL fRameWindow)
{return ERROR_SUCCESS;
}HRESULT CXWebBrowser::TranslateAccelerator(LPMSG lpMsg, const GUID *pguidCmdGroup, DWORD nCmdID)
{return ERROR_SUCCESS;
}HRESULT CXWebBrowser::GetOptionKeyPath(LPOLESTR *pchKey, DWORD dw)
{return ERROR_SUCCESS;
}HRESULT CXWebBrowser::GetDropTarget(IDropTarget *pDropTarget, IDropTarget **ppDropTarget)
{return ERROR_SUCCESS;
}HRESULT CXWebBrowser::GetExternal(IDispatch **ppDispatch)
{*ppDispatch = this;return S_OK;return ERROR_SUCCESS;
}HRESULT CXWebBrowser::TranslateUrl(DWORD dwTranslate, OLECHAR *pchURLIn, OLECHAR **ppchURLOut)
{return ERROR_SUCCESS;
}HRESULT CXWebBrowser::FilterDataObject(IDataObject *pDO, IDataObject **ppDORet)
{return ERROR_SUCCESS;
}//IOleInPlaceSiteHRESULT CXWebBrowser::CanInPlaceActivate(void)
{if (m_bInPlaced){return S_FALSE;}else{m_bInPlaced = TRUE;return ERROR_SUCCESS;}
}HRESULT CXWebBrowser::OnInPlaceActivate(void)
{return ERROR_SUCCESS;
}HRESULT CXWebBrowser::OnUIActivate(void)
{return ERROR_SUCCESS;
}HRESULT CXWebBrowser::GetWindowContext(IOleInPlaceFrame **ppFrame, IOleInPlaceUIWindow **ppDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo)
{RECT rect;*ppFrame = (IOleInPlaceFrame*)this;AddRef();*ppDoc = NULL;GetClientRect(m_hDlg, &rect);*lprcPosRect = rect;*lprcClipRect = rect;lpFrameInfo->cb = sizeof(OLEINPLACEFRAMEINFO);lpFrameInfo->hwndFrame = GetParent(m_hDlg);lpFrameInfo->cAccelEntries = 0;lpFrameInfo->fMDIApp = FALSE;lpFrameInfo->haccel = NULL;return ERROR_SUCCESS;
}HRESULT CXWebBrowser::Scroll(SIZE scrollExtant)
{return E_NOTIMPL;
}HRESULT CXWebBrowser::OnUIDeactivate(BOOL fUndoable)
{return ERROR_SUCCESS;
}HRESULT CXWebBrowser::OnInPlaceDeactivate(void)
{return ERROR_SUCCESS;
}HRESULT CXWebBrowser::DiscardUndoState(void)
{return ERROR_SUCCESS;
}HRESULT CXWebBrowser::DeactivateAndUndo(void)
{return ERROR_SUCCESS;
}HRESULT CXWebBrowser::OnPosRectChange(LPCRECT lprcPosRect)
{return ERROR_SUCCESS;
}//
BOOL CXWebBrowser::Initialize(HWND hDlg)
{RECT rect;IConnectionPointContainer* pCPC = NULL;IConnectionPoint* pCP  = NULL;DWORD dwCookie = 0;if (!m_bInPlaced){
#if _DEBUG_ASSERT(IsWindow(hDlg));
#endifm_hDlg = hDlg;GetClientRect(m_hDlg, &rect);m_pObject->DoVerb(OLEIVERB_INPLACEACTIVATE, 0, (IOleClientSite *)this, 0, m_hDlg, &rect);m_pIWebBrowser2->QueryInterface(IID_IConnectionPointContainer, (void**)&pCPC);pCPC->FindConnectionPoint(DIID_DWebBrowserEvents2, &pCP);pCP->Advise((IUnknown*)(void*)this, &dwCookie);m_bInPlaced = TRUE;return TRUE;}else{return FALSE;}
}HWND CXWebBrowser::GetHwnd()
{return m_hDlg;
}CComPtr<IOleObject> CXWebBrowser::GetIOleObject()
{return m_pObject;
}CComPtr<IWebBrowser2> CXWebBrowser::GetIWebBrowser2()
{return m_pIWebBrowser2;
}CComPtr<IOleInPlaceObject> CXWebBrowser::GetIOleInPlaceObject()
{return m_pInPlaceObj;
}CComPtr<IOleInPlaceActiveObject>  CXWebBrowser::GetIOleInPlaceActiveObject()
{return m_pInPlaceActiveObj;
}BOOL CXWebBrowser::OpenUrl(PWCHAR pszUrl)
{BOOL bRet = FALSE;VARIANT vUrl;if (pszUrl == NULL) return bRet;VariantInit(&vUrl);vUrl.vt = VT_BSTR;vUrl.bstrVal = SysAllocString(pszUrl);if (vUrl.bstrVal){m_bDocumentComplete = FALSE;m_pIWebBrowser2->put_Silent(VARIANT_TRUE);//禁止脚本错误提示框弹出m_pIWebBrowser2->Navigate2(&vUrl, NULL, NULL, NULL, NULL);VariantClear(&vUrl);bRet = TRUE;}return bRet;
}VOID CXWebBrowser::DoPageAction(_PAGE_ACT eAct)
{switch (eAct){case PAGE_GOBACK:m_pIWebBrowser2->GoBack();break;case PAGE_GOFORWARD:m_pIWebBrowser2->GoForward();break;case PAGE_GOHOME:m_pIWebBrowser2->GoHome();break;case PAGE_SEARCH:m_pIWebBrowser2->GoSearch();break;case PAGE_REFRESH:m_pIWebBrowser2->Refresh();break;case PAGE_STOP:m_pIWebBrowser2->Stop();break;}
}BOOL CXWebBrowser::PutHtmlCode(PWCHAR pszCode)
{BOOL bRet = FALSE;IDispatch *pDispatch = NULL;IHTMLDocument2 *htmlDoc2 = NULL;SAFEARRAY *sfArray = NULL;SAFEARRAYBOUND ArrayBound = {1, 0};VARIANT *pVar = NULL;if (pszCode == NULL) return bRet;__try{if (m_pIWebBrowser2->get_Document(&pDispatch) != ERROR_SUCCESS)__leave;if (pDispatch == NULL)__leave;if (pDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&htmlDoc2) != ERROR_SUCCESS)__leave;if (htmlDoc2 == NULL)__leave;sfArray = SafeArrayCreate(VT_VARIANT, 1, (SAFEARRAYBOUND *)&ArrayBound);if (sfArray == NULL)__leave;if (SafeArrayAccessData(sfArray, (void**)&pVar) != ERROR_SUCCESS) __leave;pVar->vt = VT_BSTR;pVar->bstrVal = SysAllocString(pszCode);SafeArrayUnaccessData(sfArray);htmlDoc2->write(sfArray);htmlDoc2->close();htmlDoc2 = NULL;SafeArrayDestroy(sfArray);bRet = TRUE;}__finally{if (htmlDoc2) htmlDoc2->Release();if (pDispatch) pDispatch->Release();}m_bDocumentComplete = TRUE;return bRet;
}BOOL CXWebBrowser::GetHtmlCode(PWCHAR pszCode, int *iszCount)
{BOOL bRet = FALSE;IDispatch *pDispatch = NULL;IHTMLDocument2 *htmlDoc2 = NULL;IHTMLElement *pBodyElement = NULL;PWCHAR pHtmlCode = NULL;int iLen = 0;if (pszCode == NULL || iszCount == NULL) return bRet;__try{if (m_pIWebBrowser2->get_Document(&pDispatch) != ERROR_SUCCESS) __leave;if (pDispatch == NULL) __leave;if (pDispatch->QueryInterface(IID_IHTMLDocument2, (void**)&htmlDoc2) != ERROR_SUCCESS) __leave;if (htmlDoc2 == NULL) __leave;htmlDoc2->get_body(&pBodyElement);if (pBodyElement == NULL) __leave;pBodyElement->get_innerHTML(&pHtmlCode);if (pHtmlCode == NULL) __leave;iLen = lstrlenW(pHtmlCode) + 1;//还有个'\0'if (pszCode){if (*iszCount >= iLen){ZeroMemory(pszCode, *iszCount * sizeof(WCHAR));CopyMemory(pszCode, pHtmlCode, iLen * sizeof(WCHAR));}}else{*iszCount = iLen;__leave;}bRet = TRUE;}__finally{if (pBodyElement) pBodyElement->Release();if (htmlDoc2) htmlDoc2->Release();if (pDispatch) pDispatch->Release();}return bRet;
}BOOL CXWebBrowser::ClickElementByID(PWCHAR pID)
{BOOL bRet = FALSE;IDispatch *pDispatch = NULL;IHTMLDocument3 *htmlDoc3 = NULL;IHTMLElement *pElement = NULL;if (pID == NULL) return bRet;__try{if (m_pIWebBrowser2->get_Document(&pDispatch) != ERROR_SUCCESS) __leave;if (pDispatch == NULL) __leave;if (pDispatch->QueryInterface(IID_IHTMLDocument3, (void**)&htmlDoc3) != ERROR_SUCCESS) __leave;if (htmlDoc3 == NULL) __leave;htmlDoc3->getElementById(pID, &pElement);if (pElement == NULL) __leave;pElement->click();bRet = TRUE;}__finally{if (pElement) pElement->Release();if (htmlDoc3) htmlDoc3->Release();if (pDispatch) pDispatch->Release();}return bRet;
}BOOL CXWebBrowser::SetElementValueByID(PWCHAR pID, PWCHAR pszValue)
{BOOL bRet = FALSE;IDispatch *pDispatch = NULL;IHTMLDocument3 *htmlDoc3 = NULL;IHTMLElement *pElement = NULL;VARIANT variant;if (pID == NULL || pszValue == NULL) return bRet;__try{if (m_pIWebBrowser2->get_Document(&pDispatch) != ERROR_SUCCESS) __leave;if (pDispatch == NULL) __leave;if (pDispatch->QueryInterface(IID_IHTMLDocument3, (void**)&htmlDoc3) != ERROR_SUCCESS) __leave;if (htmlDoc3 == NULL) __leave;htmlDoc3->getElementById(pID, &pElement);if (pElement == NULL) __leave;VariantInit(&variant);variant.vt = VT_BSTR;variant.bstrVal = SysAllocString(pszValue);if (variant.bstrVal == NULL) __leave;pElement->setAttribute(L"value", variant);VariantClear(&variant);bRet = TRUE;}__finally{if (pElement) pElement->Release();if (htmlDoc3) htmlDoc3->Release();if (pDispatch) pDispatch->Release();}return bRet;
}BOOL CXWebBrowser::GetElementValueByID(PWCHAR pID, PWCHAR pszValue, int *iszCount/*字符数*/)
{BOOL bRet = FALSE;IDispatch *pDispatch = NULL;IHTMLDocument3 *htmlDoc3 = NULL;IHTMLElement *pElement = NULL;VARIANT variant;int iLen;if (iszCount == NULL) return bRet;__try{if (m_pIWebBrowser2->get_Document(&pDispatch) != ERROR_SUCCESS) __leave;if (pDispatch == NULL) __leave;if (pDispatch->QueryInterface(IID_IHTMLDocument3, (void**)&htmlDoc3) != ERROR_SUCCESS) __leave;if (htmlDoc3 == NULL) __leave;htmlDoc3->getElementById(pID, &pElement);if (pElement == NULL) __leave;VariantInit(&variant);pElement->getAttribute(L"value", 0, &variant);iLen = lstrlenW(variant.bstrVal) + 1;if (*iszCount >= iLen && pszValue){ZeroMemory(pszValue, *iszCount * sizeof(WCHAR));CopyMemory(pszValue, variant.bstrVal, iLen * sizeof(WCHAR));}else{*iszCount = iLen;VariantClear(&variant);__leave;}VariantClear(&variant);bRet = TRUE;}__finally{if (pElement) pElement->Release();if (htmlDoc3) htmlDoc3->Release();if (pDispatch) pDispatch->Release();}return bRet;
}
IHTMLDocument2* CXWebBrowser::GetHTMLDocument2()
{IHTMLDocument2 * pDoc2 = 0;LPDISPATCH lpDisp;GetIWebBrowser2()->get_Document(&lpDisp);lpDisp->QueryInterface(IID_IHTMLDocument2, (void **)&pDoc2);return pDoc2;
}void CXWebBrowser::Resize()
{if(m_hWndIPActiveObject){RECT rc;GetClientRect(m_hDlg, &rc);SetWindowPos(m_hWndIPActiveObject, NULL, rc.left, rc.top, rc.right, rc.bottom, SWP_NOACTIVATE | SWP_NOZORDER);}
}void CXWebBrowser::GetZoomRange()
{CComVariant varRange;m_pIWebBrowser2->ExecWB(OLECMDID_OPTICAL_GETZOOMRANGE, OLECMDEXECOPT_DODEFAULT, NULL, &varRange);_ASSERT(V_VT(&varRange) == VT_I4);m_wMinZoom = LOWORD(V_I4(&varRange)); // 最小缩放比例m_wMaxZoom = HIWORD(V_I4(&varRange)); // 最大缩放比例
}
//读取当前页面缩放比例
void CXWebBrowser::GetZoom()
{CComVariant varZoom;m_pIWebBrowser2->ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DODEFAULT, NULL, &varZoom);_ASSERT(V_VT(&varZoom) == VT_I4);m_ulZoom = V_I4(&varZoom);    // 当前缩放比例, 100 表示100%,即原始尺寸
}void CXWebBrowser::ZoomIn()
{GetZoom();m_ulZoom += 10;SetZoom(m_ulZoom);
}void CXWebBrowser::ZoomOut()
{GetZoom();m_ulZoom -= 10;SetZoom(m_ulZoom);
}void CXWebBrowser::SetZoom(WORD nZoom)
{CComVariant varZoom((int)nZoom);  // nZoom是要设置的缩放比例m_pIWebBrowser2->ExecWB(OLECMDID_OPTICAL_ZOOM, OLECMDEXECOPT_DODEFAULT, &varZoom, NULL);
}void CXWebBrowser::MyMethod()
{CString str;str.Format(_T("%d"), 200);MessageBox(NULL,_T("js调用本地MyMethod方法,方法ID:")+ str, str, 1);
}

借鉴文章地址 1.  https://www.cnblogs.com/lucc/archive/2010/11/24/1886087.html

2.  https://www.cnblogs.com/aishangxue/p/3411070.html

3.  https://www.itdaan.com/blog/2015/03/22/ffe5c8fcf509bfb54f984c2f6481cfb7.html

4. https://blog.csdn.net/mfcing/article/details/44540683/

5.https://blog.csdn.net/wenzhou1219/article/details/78311171?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromBaidu-3.control

IE中JS与C++交互 MFC相关推荐

  1. cef js返回c++的代码_CEF3开发者系列之外篇——IE中JS与C++交互

    使用IE内核开发客户端产品,系统和前端页面之间的交互,通常给开发和维护带来很大的便利性.但操作系统和前端之间的交互却是比较复杂的.具体来说就是脚本语言和编译语言的交互.在IE内核中html和css虽然 ...

  2. UIWebView中JS与OC交互 WebViewJavascriptBridge的使用

    一.综述 现在很多的应用都会在多种平台上发布,所以很多程序猿们都开始使用Hybrid App的设计模式.就是在app上嵌入网页,只要写一份网页代码,就可以跑在不同的系统上.在iOS中,app多是通过W ...

  3. Android极简的js与java交互库一一SimpleJavaJsBridge

    今日科技快讯 根据相关报道,本月底旧版本Uber中国App将全面停止在中国的服务.内部人士透露,所有的Uber中国司机也正在被转移到滴滴司机的平台上,月底会全部转移完成. 另外滴滴出行新成立了一个部门 ...

  4. JS 与Flex交互:html中的js 与flex中的actionScript通信

    Flex与JavaScript交互的问题,这里和大家分享一下,主要包括Flex调用JavaScript中的函数和JavaScript调用Flex中的函数两大部分内容. Flex 与JavaScript ...

  5. vue+node.js前后端交互中的token令牌验证

    这篇文章分享一下本人学习vue+node.js前后端交互中的登录token令牌的心得 最近准备写一个个人博客网站,前端采用的是vue+element,后端用node.js 在做用户登录的时候就想到 如 ...

  6. android 和h5交互,Android中与H5的交互

    Android日常开发中,常常会遇到加载H5页面的情况,于是少不了与H5页面的交互问题.具体表现在Android调用H5代码及H5中调用Android代码两种情况. 测试页面 test.png 这里我 ...

  7. js与C++交互及C++解析json

    转载:http://zhidao.baidu.com/link?url=LLuWzwMmpfVcQeSGv1CrAfRXpnZaetm9xypqwMW6zxLhhKES-rITAsG0-Ku-bSMA ...

  8. c html联调,JS与native 交互简单应用

    JS与native 交互简单应用 一.objectiveC 语法简介 二.简易项目浏览器搭建 新建项目步骤: 1> DraggedImage.png 2> 2222.png 3> 3 ...

  9. Js与flash交互:在html页面中用js与MyReport插件交互

    <sdt id="89512093" sdtgroup="t" contentlocked="t" sdtlocked="t ...

最新文章

  1. LLVM3.8停止了旧Windows版本,取消Autoconf,改进Clang
  2. JAVA面试题集收藏大放送
  3. apmserver导入MySQL_mysql数据库导入导出
  4. zblog php和asp功能,ZBlog是否适合PHP或ASP?我们该如何选择?
  5. 首发Android 13!谷歌Pixel 7 Pro渲染图曝光:后置相机模组吸睛
  6. 关于生活工作学习之感悟-第一篇
  7. 关于在VC + + 2008 VCRedist安装时生成在根目录下的临时文件
  8. android教师评价系统源码,教师评价系统
  9. 缠中说禅 教你炒股票 全集列表
  10. 宋佳乐和郭晓婷天津之眼观景照片
  11. tplogin怎么创建虚拟服务器,TP-Link路由器作为二级路由器用的设置方法
  12. happen-before讲解
  13. OSWorkflow(转载)
  14. 七夕告白html网页,html5+CSS3+JS七夕告白功能实现详解
  15. 电点国际化翻译系统,助力你开启海外项目之旅
  16. 外媒称编程课成中国家长“新宠”:人工智能从娃娃抓起【楚才国科】
  17. Python breakpoint()函数
  18. png图片与svg图片的转换----icon图标的制作
  19. Handlebars模板引擎中的each用法(type=“text/x-handlebars-template“)
  20. 图像/图片怎么resize?

热门文章

  1. 网络安全硬件-防火墙AF
  2. 如何正确的关闭计算机 分步骤作答,如何正确关闭电脑谁比较了解
  3. 这种蔬菜水果店管理技巧,简直就是王炸操作!
  4. c# 拒绝访问 进程_c# - 无法复制文件,拒绝访问路径
  5. iis对UNC路径的访问被拒绝
  6. c语言文件fwrite,C语言中的文件写函数fwrite的问题,如何解决?
  7. 百度竞价开户怎么弄的?
  8. 中国技术社区活动日历表发布啦
  9. Virtual Judge使用介绍
  10. freeswitch的安装和配置 重点是端口设置