C++之WebBrowser容器,SDK实现
来源:互联网 发布:网络新词贫民窟女孩 编辑:程序博客网 时间:2024/06/06 12:46
这几天一直在研究程序窗口显示网页的方法,刚一开始不得其法,后来咨询一大神,介绍说是用WebBrowser来做成dll或者是lib,然后用程序窗口调用这个lib或者dll,这样正是符合我的要求.因为我要做成和QQ游戏大厅一样的结果.废话不多说,代码如果.代码是从http://blog.csdn.net/sidyhe/article/details/9073485拷贝过来的,不过运行的时候有问题,就修改了一下,是Initialize的声音,前面加了一个virtual
XWebBrowser.h
// XWebBrowser.h: interface for the CXWebBrowser class.// http://blog.csdn.net/Sidyhe//////////////////////////////////////////////////////////////////////#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//有冲突,居然被宏定义了,取消掉(WinUser.h中)#ifdef TranslateAccelerator#undef TranslateAccelerator#endif#include <oleidl.h>#include <MsHTML.h>#include <MSHTMHST.H>#include <EXDISP.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(); ~CXWebBrowser();//////////////////////////////////////////////////////////////////////////// 考虑到以后可能被继承/重载,所以写成虚的,但是本身也实现了protected://IUnKnown virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid, void **ppvObject); virtual ULONG STDMETHODCALLTYPE AddRef(void); virtual ULONG STDMETHODCALLTYPE Release(void);//IDispatch virtual 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);//IOleWindow virtual HRESULT STDMETHODCALLTYPE GetWindow(HWND *phwnd); virtual HRESULT STDMETHODCALLTYPE ContextSensitiveHelp(BOOL fEnterMode);//IOleInPlaceUIWindow virtual 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);//IOleInPlaceFrame virtual 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);//IOleClientSite virtual 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);//IOleInPlaceSite virtual 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://内部私有变量 IStorage *m_pStorage; //存储根对象 IOleObject *m_pObject; //OLE对象 IOleInPlaceObject *m_pInPlaceObj; //InPlace对象 IWebBrowser2 *m_pIWebBrowser2; //IWebBrowser2对象 HWND m_hDlg; //窗口容器 BOOL m_bInPlaced; //是否替代??? DWORD m_RefCount; //引用计数 IOleInPlaceActiveObject *m_pInPlaceActiveObj;public://公开外部可调用函数 virtual BOOL Initialize(IN HWND hDlg/*窗体句柄,IE控件的容器*/); HWND GetHwnd(void); IOleObject* GetIOleObject(void); IWebBrowser2* GetIWebBrowser2(void); IOleInPlaceObject* GetIOleInPlaceObject(void); 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/*字符数*/);};#endif/*目前无法实现快捷键的复制/粘贴等操作解决方法之一是用CreateWindowEx创建窗体在后面的GetMessage中做按键判断再向WebBrowser发送命令粘贴命令:(参见OLECMDID枚举结构)m_pIWebBrowser2->ExecWB(OLECMDID_PASTE, OLECMDEXECOPT_DODEFAULT, NULL, NULL);*/
XWebBrowser.cpp
// XWebBrowser.cpp: implementation of the CXWebBrowser class.// http://blog.csdn.net/Sidyhe//////////////////////////////////////////////////////////////////////#include "stdafx.h"#include "XWebBrowser.h"//////////////////////////////////////////////////////////////////////// Construction/Destruction//////////////////////////////////////////////////////////////////////CXWebBrowser::CXWebBrowser(){ //初始化 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);#else StgCreateDocfile(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_pInPlaceActiveObj->Release();//IOleInPlaceActiveObject m_pInPlaceObj->Release();//IOleInPlaceObject m_pIWebBrowser2->Release();//IWebBrowser2 m_pObject->Close(OLECLOSE_NOSAVE); m_pObject->Release(); //有必要么 // OleClose(m_pObject);}//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 _DEBUG if (InterlockedExchangeAdd((PLONG)&m_RefCount, -1) == 0) _ASSERT(0);#else InterlockedExchangeAdd((PLONG)&m_RefCount, -1);#endif return 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){ return E_NOTIMPL;}HRESULT CXWebBrowser::Invoke(DISPID dispIdMember, REFIID riid, LCID lcid, WORD wFlags, DISPPARAMS *pDispParams, VARIANT *pVarResult, EXCEPINFO *pExcepInfo, UINT *puArgErr){ 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){ 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){ 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));#endif m_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;}IOleObject* CXWebBrowser::GetIOleObject(){ return m_pObject;}IWebBrowser2* CXWebBrowser::GetIWebBrowser2(){ return m_pIWebBrowser2;}IOleInPlaceObject* CXWebBrowser::GetIOleInPlaceObject(){ return m_pInPlaceObj;}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_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; } return;}BOOL CXWebBrowser::PutHtmlCode(PWCHAR pszCode){ BOOL bRet = FALSE; VARIANT vUrl; IDispatch *pDispatch = NULL; IHTMLDocument2 *htmlDoc2 = NULL; SAFEARRAY *sfArray = NULL; SAFEARRAYBOUND ArrayBound = {1, 0}; VARIANT *pVar = NULL; if (pszCode == NULL) return bRet; __try { VariantInit(&vUrl); vUrl.vt = VT_BSTR; vUrl.bstrVal = SysAllocString(L"about:blank"); if (!vUrl.bstrVal) __leave; m_pIWebBrowser2->Navigate2(&vUrl, NULL, NULL, NULL, NULL); VariantClear(&vUrl); 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); htmlDoc2->write(sfArray); htmlDoc2->close(); SafeArrayDestroy(sfArray); bRet = TRUE; } __finally { if (htmlDoc2) htmlDoc2->Release(); if (pDispatch) pDispatch->Release(); } 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;}
然后创建一个窗口程序,调用上面的lib文件代码如下.
//////////////////////////////////////////////////////////////////////////// #include "XWebBrowser.h"static const char ClassName[] = "Browser Example";CXWebBrowser *cWeb = NULL;LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { //WCHAR szC[100]; int szi = 1; if (uMsg == WM_CLOSE) { PostQuitMessage(0); return 0; } if (uMsg == WM_HOTKEY) { return 0; } return DefWindowProc(hwnd, uMsg, wParam, lParam);}int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hInstNULL, LPSTR lpszCmdLine, int nCmdShow){ MSG msg; if (OleInitialize(NULL) == S_OK) { WNDCLASSEX wc; ZeroMemory(&wc, sizeof(WNDCLASSEX)); wc.cbSize = sizeof(WNDCLASSEX); wc.hInstance = hInstance; wc.lpfnWndProc = WindowProc; wc.lpszClassName = &ClassName[0]; RegisterClassEx(&wc); if ((msg.hwnd = CreateWindowEx(0, &ClassName[0], "百度", WS_OVERLAPPEDWINDOW, 0, 0, 1024, 768, HWND_DESKTOP, NULL, hInstance, NULL))) { cWeb = new CXWebBrowser(); cWeb->Initialize(msg.hwnd); cWeb->OpenUrl(L"http://www.baidu.com"); RegisterHotKey(msg.hwnd, 0x512, 0, VK_F1); ShowWindow(msg.hwnd, nCmdShow); UpdateWindow(msg.hwnd); } while (GetMessage(&msg, 0, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } OleUninitialize(); return(0); } MessageBox(0, "Can't open OLE!", "ERROR", MB_OK); return 0;}
调用lib方法如图
0 0
- 使用C++实现SDK之WebBrowser容器
- 使用C++实现SDK之WebBrowser容器
- C++之WebBrowser容器,SDK实现
- C++之WebBrowser容器,SDK实现
- 使用C++实现SDK之WebBrowser容器
- 使用C++实现SDK之WebBrowser容器
- (转)使用C++实现SDK之WebBrowser容器
- 使用C++实现SDK之WebBrowser容器 系列的一个补充. 关于GetHtmlDocumentX()
- 使用C++实现SDK之WebBrowser容器 系列的一个补充. 关于GetHtmlDocumentX()
- 【C++】实现容器Vector
- c++STL通用容器 之 bitset容器
- C语言--容器的实现。
- map容器的c实现
- map容器的c实现
- 自己实现C++list容器
- c#webBrowser 实现自动填入选择下拉列表
- C#webBrowser实现在新选项卡打开链接
- C++STL之堆栈容器
- java 判断电话号码,邮箱格式是否正确
- system表空间的数据文件损坏是否能恢复
- 使用JDBC的addBatch()方法
- [Python--]用Python实现时间离散化
- 字典序问题
- C++之WebBrowser容器,SDK实现
- 未来你好 记于2015-01-01
- Set IP automatically in Windows
- 云计算市场风云迭起,如何采用云战略?
- js 日期加减
- iOS-BLE流程图
- 树状数组(2)
- Elyar的java笔记--Java简单文件操作
- 在eclipse中配置tomcat