先给出几个文件的内容:
Entry.c
#include "Header.h" HRESULT STDMETHODCALLTYPE UI_QueryInterface(IDocHostUIHandler FAR* This, REFIID riid, LPVOID FAR* ppvObj) { return(Site_QueryInterface((IOleClientSite *)((char *)This - sizeof(IOleClientSite) - sizeof(_IOleInPlaceSiteEx)), riid, ppvObj)); } HRESULT STDMETHODCALLTYPE UI_AddRef(IDocHostUIHandler FAR* This) { return(1); } HRESULT STDMETHODCALLTYPE UI_Release(IDocHostUIHandler FAR* This) { return(1); } HRESULT STDMETHODCALLTYPE UI_ShowContextMenu(IDocHostUIHandler FAR* This, DWORD dwID, POINT __RPC_FAR *ppt, IUnknown __RPC_FAR *pcmdtReserved, IDispatch __RPC_FAR *pdispReserved) { return(S_OK); } HRESULT STDMETHODCALLTYPE UI_GetHostInfo(IDocHostUIHandler FAR* This, DOCHOSTUIINFO __RPC_FAR *pInfo) { pInfo->cbSize = sizeof(DOCHOSTUIINFO); pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER; pInfo->dwDoubleClick = DOCHOSTUIDBLCLK_DEFAULT; return(S_OK); } HRESULT STDMETHODCALLTYPE UI_ShowUI(IDocHostUIHandler FAR* This, DWORD dwID, IOleInPlaceActiveObject __RPC_FAR *pActiveObject, IOleCommandTarget __RPC_FAR *pCommandTarget, IOleInPlaceFrame __RPC_FAR *pFrame, IOleInPlaceUIWindow __RPC_FAR *pDoc) { return(S_OK); } HRESULT STDMETHODCALLTYPE UI_HideUI(IDocHostUIHandler FAR* This) { return(S_OK); } HRESULT STDMETHODCALLTYPE UI_UpdateUI(IDocHostUIHandler FAR* This) { return(S_OK); } HRESULT STDMETHODCALLTYPE UI_EnableModeless(IDocHostUIHandler FAR* This, BOOL fEnable) { return(S_OK); } HRESULT STDMETHODCALLTYPE UI_OnDocWindowActivate(IDocHostUIHandler FAR* This, BOOL fActivate) { return(S_OK); } HRESULT STDMETHODCALLTYPE UI_OnFrameWindowActivate(IDocHostUIHandler FAR* This, BOOL fActivate) { return(S_OK); } HRESULT STDMETHODCALLTYPE UI_ResizeBorder(IDocHostUIHandler FAR* This, LPCRECT prcBorder, IOleInPlaceUIWindow __RPC_FAR *pUIWindow, BOOL fRameWindow) { return(S_OK); } HRESULT STDMETHODCALLTYPE UI_TranslateAccelerator(IDocHostUIHandler FAR* This, LPMSG lpMsg, const GUID __RPC_FAR *pguidCmdGroup, DWORD nCmdID) { return(S_FALSE); } HRESULT STDMETHODCALLTYPE UI_GetOptionKeyPath(IDocHostUIHandler FAR* This, LPOLESTR __RPC_FAR *pchKey, DWORD dw) { return(S_FALSE); } HRESULT STDMETHODCALLTYPE UI_GetDropTarget(IDocHostUIHandler FAR* This, IDropTarget __RPC_FAR *pDropTarget, IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget) { return(S_FALSE); } HRESULT STDMETHODCALLTYPE UI_GetExternal(IDocHostUIHandler FAR* This, IDispatch __RPC_FAR *__RPC_FAR *ppDispatch) { *ppDispatch = 0; return(S_FALSE); } HRESULT STDMETHODCALLTYPE UI_TranslateUrl(IDocHostUIHandler FAR* This, DWORD dwTranslate, OLECHAR __RPC_FAR *pchURLIn, OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut) { *ppchURLOut = 0; return(S_FALSE); } HRESULT STDMETHODCALLTYPE UI_FilterDataObject(IDocHostUIHandler FAR* This, IDataObject __RPC_FAR *pDO, IDataObject __RPC_FAR *__RPC_FAR *ppDORet) { *ppDORet = 0; return(S_FALSE); } HRESULT STDMETHODCALLTYPE Site_QueryInterface(IOleClientSite FAR* This, REFIID riid, void ** ppvObject) { if (!memcmp(riid, &IID_IUnknown, sizeof(GUID)) || !memcmp(riid, &IID_IOleClientSite, sizeof(GUID))) *ppvObject = &((_IOleClientSiteEx *)This)->client; else if (!memcmp(riid, &IID_IOleInPlaceSite, sizeof(GUID))) *ppvObject = &((_IOleClientSiteEx *)This)->inplace; else if (!memcmp(riid, &IID_IDocHostUIHandler, sizeof(GUID))) *ppvObject = &((_IOleClientSiteEx *)This)->ui; else { *ppvObject = 0; return(E_NOINTERFACE); } return(S_OK); } HRESULT STDMETHODCALLTYPE Site_AddRef(IOleClientSite FAR* This) { return(1); } HRESULT STDMETHODCALLTYPE Site_Release(IOleClientSite FAR* This) { return(1); } HRESULT STDMETHODCALLTYPE Site_SaveObject(IOleClientSite FAR* This) { NOTIMPLEMENTED; } HRESULT STDMETHODCALLTYPE Site_GetMoniker(IOleClientSite FAR* This, DWORD dwAssign, DWORD dwWhichMoniker, IMoniker ** ppmk) { NOTIMPLEMENTED; } HRESULT STDMETHODCALLTYPE Site_GetContainer(IOleClientSite FAR* This, LPOLECONTAINER FAR* ppContainer) { *ppContainer = 0; return(E_NOINTERFACE); } HRESULT STDMETHODCALLTYPE Site_ShowObject(IOleClientSite FAR* This) { return(NOERROR); } HRESULT STDMETHODCALLTYPE Site_OnShowWindow(IOleClientSite FAR* This, BOOL fShow) { NOTIMPLEMENTED; } HRESULT STDMETHODCALLTYPE Site_RequestNewObjectLayout(IOleClientSite FAR* This) { NOTIMPLEMENTED; } HRESULT STDMETHODCALLTYPE InPlace_QueryInterface(IOleInPlaceSite FAR* This, REFIID riid, LPVOID FAR* ppvObj) { return(Site_QueryInterface((IOleClientSite *)((char *)This - sizeof(IOleClientSite)), riid, ppvObj)); } HRESULT STDMETHODCALLTYPE InPlace_AddRef(IOleInPlaceSite FAR* This) { return(1); } HRESULT STDMETHODCALLTYPE InPlace_Release(IOleInPlaceSite FAR* This) { return(1); } HRESULT STDMETHODCALLTYPE InPlace_GetWindow(IOleInPlaceSite FAR* This, HWND FAR* lphwnd) { *lphwnd = ((_IOleInPlaceSiteEx FAR*)This)->frame.window; return(S_OK); } HRESULT STDMETHODCALLTYPE InPlace_ContextSensitiveHelp(IOleInPlaceSite FAR* This, BOOL fEnterMode) { NOTIMPLEMENTED; } HRESULT STDMETHODCALLTYPE InPlace_CanInPlaceActivate(IOleInPlaceSite FAR* This) { return(S_OK); } HRESULT STDMETHODCALLTYPE InPlace_OnInPlaceActivate(IOleInPlaceSite FAR* This) { return(S_OK); } HRESULT STDMETHODCALLTYPE InPlace_OnUIActivate(IOleInPlaceSite FAR* This) { return(S_OK); } HRESULT STDMETHODCALLTYPE InPlace_GetWindowContext(IOleInPlaceSite FAR* This, LPOLEINPLACEFRAME FAR* lplpFrame, LPOLEINPLACEUIWINDOW FAR* lplpDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo) { *lplpFrame = (LPOLEINPLACEFRAME)&((_IOleInPlaceSiteEx *)This)->frame; *lplpDoc = 0; lpFrameInfo->fMDIApp = FALSE; lpFrameInfo->hwndFrame = ((_IOleInPlaceFrameEx *)*lplpFrame)->window; lpFrameInfo->haccel = 0; lpFrameInfo->cAccelEntries = 0; return(S_OK); } HRESULT STDMETHODCALLTYPE InPlace_Scroll(IOleInPlaceSite FAR* This, SIZE scrollExtent) { NOTIMPLEMENTED; } HRESULT STDMETHODCALLTYPE InPlace_OnUIDeactivate(IOleInPlaceSite FAR* This, BOOL fUndoable) { return(S_OK); } HRESULT STDMETHODCALLTYPE InPlace_OnInPlaceDeactivate(IOleInPlaceSite FAR* This) { return(S_OK); } HRESULT STDMETHODCALLTYPE InPlace_DiscardUndoState(IOleInPlaceSite FAR* This) { NOTIMPLEMENTED; } HRESULT STDMETHODCALLTYPE InPlace_DeactivateAndUndo(IOleInPlaceSite FAR* This) { NOTIMPLEMENTED; } HRESULT STDMETHODCALLTYPE InPlace_OnPosRectChange(IOleInPlaceSite FAR* This, LPCRECT lprcPosRect) { IOleObject *browserObject; IOleInPlaceObject *inplace; browserObject = *((IOleObject **)((char *)This - sizeof(IOleObject *) - sizeof(IOleClientSite))); if (!browserObject->lpVtbl->QueryInterface(browserObject, &IID_IOleInPlaceObject, (void**)&inplace)) { inplace->lpVtbl->SetObjectRects(inplace, lprcPosRect, lprcPosRect); inplace->lpVtbl->Release(inplace); } return(S_OK); } HRESULT STDMETHODCALLTYPE Frame_QueryInterface(IOleInPlaceFrame FAR* This, REFIID riid, LPVOID FAR* ppvObj) { NOTIMPLEMENTED; } HRESULT STDMETHODCALLTYPE Frame_AddRef(IOleInPlaceFrame FAR* This) { return(1); } HRESULT STDMETHODCALLTYPE Frame_Release(IOleInPlaceFrame FAR* This) { return(1); } HRESULT STDMETHODCALLTYPE Frame_GetWindow(IOleInPlaceFrame FAR* This, HWND FAR* lphwnd) { *lphwnd = ((_IOleInPlaceFrameEx *)This)->window; return(S_OK); } HRESULT STDMETHODCALLTYPE Frame_ContextSensitiveHelp(IOleInPlaceFrame FAR* This, BOOL fEnterMode) { NOTIMPLEMENTED; } HRESULT STDMETHODCALLTYPE Frame_GetBorder(IOleInPlaceFrame FAR* This, LPRECT lprectBorder) { NOTIMPLEMENTED; } HRESULT STDMETHODCALLTYPE Frame_RequestBorderSpace(IOleInPlaceFrame FAR* This, LPCBORDERWIDTHS pborderwidths) { NOTIMPLEMENTED; } HRESULT STDMETHODCALLTYPE Frame_SetBorderSpace(IOleInPlaceFrame FAR* This, LPCBORDERWIDTHS pborderwidths) { NOTIMPLEMENTED; } HRESULT STDMETHODCALLTYPE Frame_SetActiveObject(IOleInPlaceFrame FAR* This, IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName) { return(S_OK); } HRESULT STDMETHODCALLTYPE Frame_InsertMenus(IOleInPlaceFrame FAR* This, HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths) { NOTIMPLEMENTED; } HRESULT STDMETHODCALLTYPE Frame_SetMenu(IOleInPlaceFrame FAR* This, HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject) { return(S_OK); } HRESULT STDMETHODCALLTYPE Frame_RemoveMenus(IOleInPlaceFrame FAR* This, HMENU hmenuShared) { NOTIMPLEMENTED; } HRESULT STDMETHODCALLTYPE Frame_SetStatusText(IOleInPlaceFrame FAR* This, LPCOLESTR pszStatusText) { return(S_OK); } HRESULT STDMETHODCALLTYPE Frame_EnableModeless(IOleInPlaceFrame FAR* This, BOOL fEnable) { return(S_OK); } HRESULT STDMETHODCALLTYPE Frame_TranslateAccelerator(IOleInPlaceFrame FAR* This, LPMSG lpmsg, WORD wID) { NOTIMPLEMENTED; } void UnEmbedBrowserObject(HWND hwnd, PCHAR ptrObject) { IOleObject **browserHandle; IOleObject *browserObject; if ((browserHandle = (IOleObject **)ptrObject)) { browserObject = *browserHandle; browserObject->lpVtbl->Close(browserObject, OLECLOSE_NOSAVE); browserObject->lpVtbl->Release(browserObject); GlobalFree(browserHandle); return; } _ASSERT(0); } void DoPageAction(HWND hwnd, PCHAR ptrObject, DWORD action) { IWebBrowser2 *webBrowser2; IOleObject *browserObject; browserObject = *((IOleObject **)ptrObject); if (!browserObject->lpVtbl->QueryInterface(browserObject, &IID_IWebBrowser2, (void**)&webBrowser2)) { switch (action) { case WEBPAGE_GOBACK: { webBrowser2->lpVtbl->GoBack(webBrowser2); } break; case WEBPAGE_GOFORWARD: { webBrowser2->lpVtbl->GoForward(webBrowser2); } break; case WEBPAGE_GOHOME: { webBrowser2->lpVtbl->GoHome(webBrowser2); } break; case WEBPAGE_SEARCH: { webBrowser2->lpVtbl->GoSearch(webBrowser2); } break; case WEBPAGE_REFRESH: { webBrowser2->lpVtbl->Refresh(webBrowser2); } case WEBPAGE_STOP: { webBrowser2->lpVtbl->Stop(webBrowser2); } default: break; } webBrowser2->lpVtbl->Release(webBrowser2); } return; } long DisplayHTMLStr(HWND hwnd, PCHAR ptrObject, PWCHAR string) { IWebBrowser2 *webBrowser2; LPDISPATCH lpDispatch; IHTMLDocument2 *htmlDoc2; IOleObject *browserObject; SAFEARRAY *sfArray; VARIANT myURL; VARIANT *pVar; BSTR bstr; browserObject = *((IOleObject **)ptrObject); bstr = 0; if (!browserObject->lpVtbl->QueryInterface(browserObject, &IID_IWebBrowser2, (void**)&webBrowser2)) { VariantInit(&myURL); myURL.vt = VT_BSTR; myURL.bstrVal = SysAllocString(L"about:blank"); webBrowser2->lpVtbl->Navigate2(webBrowser2, &myURL, 0, 0, 0, 0); VariantClear(&myURL); if (!webBrowser2->lpVtbl->get_Document(webBrowser2, &lpDispatch)) { if (!lpDispatch->lpVtbl->QueryInterface(lpDispatch, &IID_IHTMLDocument2, (void**)&htmlDoc2)) { if ((sfArray = SafeArrayCreate(VT_VARIANT, 1, (SAFEARRAYBOUND *)&ArrayBound))) { if (!SafeArrayAccessData(sfArray, (void**)&pVar)) { pVar->vt = VT_BSTR; bstr = SysAllocString(string); if ((pVar->bstrVal = bstr)) { htmlDoc2->lpVtbl->write(htmlDoc2, sfArray); htmlDoc2->lpVtbl->close(htmlDoc2); } } SafeArrayDestroy(sfArray); } //bad htmlDoc2->lpVtbl->Release(htmlDoc2); } lpDispatch->lpVtbl->Release(lpDispatch); } webBrowser2->lpVtbl->Release(webBrowser2); } if (bstr) return(0); return(-1); } long DisplayHTMLPage(HWND hwnd, PCHAR ptrObject, PWCHAR webPageName) { IWebBrowser2 *webBrowser2; VARIANT myURL; IOleObject *browserObject; browserObject = *((IOleObject **)ptrObject); if (!browserObject->lpVtbl->QueryInterface(browserObject, &IID_IWebBrowser2, (void**)&webBrowser2)) { VariantInit(&myURL); myURL.vt = VT_BSTR; myURL.bstrVal = SysAllocString(webPageName); if (!myURL.bstrVal) { //badalloc webBrowser2->lpVtbl->Release(webBrowser2); return(-6); } webBrowser2->lpVtbl->Navigate2(webBrowser2, &myURL, 0, 0, 0, 0); VariantClear(&myURL); webBrowser2->lpVtbl->Release(webBrowser2); return(0); } return(-5); } void ResizeBrowser(HWND hwnd, PCHAR ptrObject, DWORD width, DWORD height) { IWebBrowser2 *webBrowser2; IOleObject *browserObject; browserObject = *((IOleObject **)ptrObject); if (!browserObject->lpVtbl->QueryInterface(browserObject, &IID_IWebBrowser2, (void**)&webBrowser2)) { webBrowser2->lpVtbl->put_Width(webBrowser2, width); webBrowser2->lpVtbl->put_Height(webBrowser2, height); webBrowser2->lpVtbl->Release(webBrowser2); } } long EmbedBrowserObject(HWND hwnd, PCHAR *outObject) { LPCLASSFACTORY pClassFactory; IOleObject *browserObject; IWebBrowser2 *webBrowser2; RECT rect; char *ptr; _IOleClientSiteEx *_iOleClientSiteEx; if (!(ptr = (char *)GlobalAlloc(GMEM_FIXED, sizeof(_IOleClientSiteEx) + sizeof(IOleObject *)))) return(-1); _iOleClientSiteEx = (_IOleClientSiteEx *)(ptr + sizeof(IOleObject *)); _iOleClientSiteEx->client.lpVtbl = &MyIOleClientSiteTable; _iOleClientSiteEx->inplace.inplace.lpVtbl = &MyIOleInPlaceSiteTable; _iOleClientSiteEx->inplace.frame.frame.lpVtbl = &MyIOleInPlaceFrameTable; _iOleClientSiteEx->inplace.frame.window = hwnd; _iOleClientSiteEx->ui.ui.lpVtbl = &MyIDocHostUIHandlerTable; pClassFactory = 0; if (!CoGetClassObject(&CLSID_WebBrowser, CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER, NULL, &IID_IClassFactory, (void **)&pClassFactory) && pClassFactory) { if (!pClassFactory->lpVtbl->CreateInstance(pClassFactory, 0, &IID_IOleObject, &browserObject)) { pClassFactory->lpVtbl->Release(pClassFactory); *((IOleObject **)ptr) = browserObject; // SetWindowLong(hwnd, GWL_USERDATA, (LONG)ptr); if (!browserObject->lpVtbl->SetClientSite(browserObject, (IOleClientSite *)_iOleClientSiteEx)) { browserObject->lpVtbl->SetHostNames(browserObject, L"My Host Name", 0); GetClientRect(hwnd, &rect); if (!OleSetContainedObject((struct IUnknown *)browserObject, TRUE) && !browserObject->lpVtbl->DoVerb(browserObject, OLEIVERB_SHOW, NULL, (IOleClientSite *)_iOleClientSiteEx, -1, hwnd, &rect) && !browserObject->lpVtbl->QueryInterface(browserObject, &IID_IWebBrowser2, (void**)&webBrowser2)) { webBrowser2->lpVtbl->put_Left(webBrowser2, 0); webBrowser2->lpVtbl->put_Top(webBrowser2, 0); webBrowser2->lpVtbl->put_Width(webBrowser2, rect.right); webBrowser2->lpVtbl->put_Height(webBrowser2, rect.bottom); webBrowser2->lpVtbl->Release(webBrowser2); *outObject = ptr; return(0); } } UnEmbedBrowserObject(hwnd, ptr); return(-4); } pClassFactory->lpVtbl->Release(pClassFactory); GlobalFree(ptr); return(-3); } GlobalFree(ptr); return(-2); } #ifdef _WINDOWS //Application Project static const TCHAR ClassName[] = "Browser Example"; PCHAR pObject = NULL; LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { switch (uMsg) { case WM_SIZE: { ResizeBrowser(hwnd, pObject, LOWORD(lParam), HIWORD(lParam)); return(0); } case WM_CREATE: { if (EmbedBrowserObject(hwnd, &pObject)) return(-1); return(0); } case WM_DESTROY: { UnEmbedBrowserObject(hwnd, pObject); PostQuitMessage(0); return(TRUE); } } return(DefWindowProc(hwnd, uMsg, wParam, lParam)); } int CALLBACK 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, 0))) { DisplayHTMLPage(msg.hwnd, pObject, L"http://www.baidu.com"); 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(-1); } #endif
WebBrowser.cpp
// Webbrowser.cpp: implementation of the CWebbrowser class. // ////////////////////////////////////////////////////////////////////// #include "Webbrowser.h" #include "PreHeader.h" ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// CWebbrowser::CWebbrowser(HWND hDialog) { m_hDlg = hDialog; EmbedBrowserObject(m_hDlg, &m_pObject); } CWebbrowser::~CWebbrowser() { UnEmbedBrowserObject(m_hDlg, m_pObject); } void CWebbrowser::ReSize(DWORD dwWidth, DWORD dwHeight) { ResizeBrowser(m_hDlg, m_pObject, dwWidth, dwHeight); } LONG CWebbrowser::DisplayByStr(PWCHAR pUnicodeString) { return DisplayHTMLStr(m_hDlg, m_pObject, pUnicodeString); } LONG CWebbrowser::OpenUrl(PWCHAR pUnicodeString) { return DisplayHTMLPage(m_hDlg, m_pObject, pUnicodeString); } VOID CWebbrowser::DoAction(_PAGE_ACT eAct) { switch (eAct) { case PAGE_GOBACK: DoPageAction(m_hDlg, m_pObject, WEBPAGE_GOBACK); break; case PAGE_GOFORWARD: DoPageAction(m_hDlg, m_pObject, WEBPAGE_GOFORWARD); break; case PAGE_GOHOME: DoPageAction(m_hDlg, m_pObject, WEBPAGE_GOHOME); break; case PAGE_SEARCH: DoPageAction(m_hDlg, m_pObject, WEBPAGE_SEARCH); break; case PAGE_REFRESH: DoPageAction(m_hDlg, m_pObject, WEBPAGE_REFRESH); break; case PAGE_STOP: DoPageAction(m_hDlg, m_pObject, WEBPAGE_STOP); break; } return; } IOleObject* CWebbrowser::GetObject() { IOleObject *browserObject; browserObject = *((IOleObject **)m_pObject); return browserObject; }
Header.h
#ifndef _INCLUDE_HEADER_FILE_H_ #define _INCLUDE_HEADER_FILE_H_ #pragma once #include <windows.h> #include <exdisp.h> #include <mshtml.h> #include <mshtmhst.h> #include <crtdbg.h> static const SAFEARRAYBOUND ArrayBound = {1, 0}; HRESULT STDMETHODCALLTYPE Frame_QueryInterface(IOleInPlaceFrame FAR* This, REFIID riid, LPVOID FAR* ppvObj); HRESULT STDMETHODCALLTYPE Frame_AddRef(IOleInPlaceFrame FAR* This); HRESULT STDMETHODCALLTYPE Frame_Release(IOleInPlaceFrame FAR* This); HRESULT STDMETHODCALLTYPE Frame_GetWindow(IOleInPlaceFrame FAR* This, HWND FAR* lphwnd); HRESULT STDMETHODCALLTYPE Frame_ContextSensitiveHelp(IOleInPlaceFrame FAR* This, BOOL fEnterMode); HRESULT STDMETHODCALLTYPE Frame_GetBorder(IOleInPlaceFrame FAR* This, LPRECT lprectBorder); HRESULT STDMETHODCALLTYPE Frame_RequestBorderSpace(IOleInPlaceFrame FAR* This, LPCBORDERWIDTHS pborderwidths); HRESULT STDMETHODCALLTYPE Frame_SetBorderSpace(IOleInPlaceFrame FAR* This, LPCBORDERWIDTHS pborderwidths); HRESULT STDMETHODCALLTYPE Frame_SetActiveObject(IOleInPlaceFrame FAR* This, IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName); HRESULT STDMETHODCALLTYPE Frame_InsertMenus(IOleInPlaceFrame FAR* This, HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths); HRESULT STDMETHODCALLTYPE Frame_SetMenu(IOleInPlaceFrame FAR* This, HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject); HRESULT STDMETHODCALLTYPE Frame_RemoveMenus(IOleInPlaceFrame FAR* This, HMENU hmenuShared); HRESULT STDMETHODCALLTYPE Frame_SetStatusText(IOleInPlaceFrame FAR* This, LPCOLESTR pszStatusText); HRESULT STDMETHODCALLTYPE Frame_EnableModeless(IOleInPlaceFrame FAR* This, BOOL fEnable); HRESULT STDMETHODCALLTYPE Frame_TranslateAccelerator(IOleInPlaceFrame FAR* This, LPMSG lpmsg, WORD wID); IOleInPlaceFrameVtbl MyIOleInPlaceFrameTable = {Frame_QueryInterface, Frame_AddRef, Frame_Release, Frame_GetWindow, Frame_ContextSensitiveHelp, Frame_GetBorder, Frame_RequestBorderSpace, Frame_SetBorderSpace, Frame_SetActiveObject, Frame_InsertMenus, Frame_SetMenu, Frame_RemoveMenus, Frame_SetStatusText, Frame_EnableModeless, Frame_TranslateAccelerator}; typedef struct { IOleInPlaceFrame frame; HWND window; } _IOleInPlaceFrameEx; HRESULT STDMETHODCALLTYPE Site_QueryInterface(IOleClientSite FAR* This, REFIID riid, void ** ppvObject); HRESULT STDMETHODCALLTYPE Site_AddRef(IOleClientSite FAR* This); HRESULT STDMETHODCALLTYPE Site_Release(IOleClientSite FAR* This); HRESULT STDMETHODCALLTYPE Site_SaveObject(IOleClientSite FAR* This); HRESULT STDMETHODCALLTYPE Site_GetMoniker(IOleClientSite FAR* This, DWORD dwAssign, DWORD dwWhichMoniker, IMoniker ** ppmk); HRESULT STDMETHODCALLTYPE Site_GetContainer(IOleClientSite FAR* This, LPOLECONTAINER FAR* ppContainer); HRESULT STDMETHODCALLTYPE Site_ShowObject(IOleClientSite FAR* This); HRESULT STDMETHODCALLTYPE Site_OnShowWindow(IOleClientSite FAR* This, BOOL fShow); HRESULT STDMETHODCALLTYPE Site_RequestNewObjectLayout(IOleClientSite FAR* This); IOleClientSiteVtbl MyIOleClientSiteTable = {Site_QueryInterface, Site_AddRef, Site_Release, Site_SaveObject, Site_GetMoniker, Site_GetContainer, Site_ShowObject, Site_OnShowWindow, Site_RequestNewObjectLayout}; HRESULT STDMETHODCALLTYPE UI_QueryInterface(IDocHostUIHandler FAR* This, REFIID riid, void ** ppvObject); HRESULT STDMETHODCALLTYPE UI_AddRef(IDocHostUIHandler FAR* This); HRESULT STDMETHODCALLTYPE UI_Release(IDocHostUIHandler FAR* This); HRESULT STDMETHODCALLTYPE UI_ShowContextMenu(IDocHostUIHandler FAR* This, DWORD dwID, POINT __RPC_FAR *ppt, IUnknown __RPC_FAR *pcmdtReserved, IDispatch __RPC_FAR *pdispReserved); HRESULT STDMETHODCALLTYPE UI_GetHostInfo(IDocHostUIHandler FAR* This, DOCHOSTUIINFO __RPC_FAR *pInfo); HRESULT STDMETHODCALLTYPE UI_ShowUI(IDocHostUIHandler FAR* This, DWORD dwID, IOleInPlaceActiveObject __RPC_FAR *pActiveObject, IOleCommandTarget __RPC_FAR *pCommandTarget, IOleInPlaceFrame __RPC_FAR *pFrame, IOleInPlaceUIWindow __RPC_FAR *pDoc); HRESULT STDMETHODCALLTYPE UI_HideUI(IDocHostUIHandler FAR* This); HRESULT STDMETHODCALLTYPE UI_UpdateUI(IDocHostUIHandler FAR* This); HRESULT STDMETHODCALLTYPE UI_EnableModeless(IDocHostUIHandler FAR* This, BOOL fEnable); HRESULT STDMETHODCALLTYPE UI_OnDocWindowActivate(IDocHostUIHandler FAR* This, BOOL fActivate); HRESULT STDMETHODCALLTYPE UI_OnFrameWindowActivate(IDocHostUIHandler FAR* This, BOOL fActivate); HRESULT STDMETHODCALLTYPE UI_ResizeBorder(IDocHostUIHandler FAR* This, LPCRECT prcBorder, IOleInPlaceUIWindow __RPC_FAR *pUIWindow, BOOL fRameWindow); HRESULT STDMETHODCALLTYPE UI_TranslateAccelerator(IDocHostUIHandler FAR* This, LPMSG lpMsg, const GUID __RPC_FAR *pguidCmdGroup, DWORD nCmdID); HRESULT STDMETHODCALLTYPE UI_GetOptionKeyPath(IDocHostUIHandler FAR* This, LPOLESTR __RPC_FAR *pchKey, DWORD dw); HRESULT STDMETHODCALLTYPE UI_GetDropTarget(IDocHostUIHandler FAR* This, IDropTarget __RPC_FAR *pDropTarget, IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget); HRESULT STDMETHODCALLTYPE UI_GetExternal(IDocHostUIHandler FAR* This, IDispatch __RPC_FAR *__RPC_FAR *ppDispatch); HRESULT STDMETHODCALLTYPE UI_TranslateUrl(IDocHostUIHandler FAR* This, DWORD dwTranslate, OLECHAR __RPC_FAR *pchURLIn, OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut); HRESULT STDMETHODCALLTYPE UI_FilterDataObject(IDocHostUIHandler FAR* This, IDataObject __RPC_FAR *pDO, IDataObject __RPC_FAR *__RPC_FAR *ppDORet); IDocHostUIHandlerVtbl MyIDocHostUIHandlerTable = {UI_QueryInterface, UI_AddRef, UI_Release, UI_ShowContextMenu, UI_GetHostInfo, UI_ShowUI, UI_HideUI, UI_UpdateUI, UI_EnableModeless, UI_OnDocWindowActivate, UI_OnFrameWindowActivate, UI_ResizeBorder, UI_TranslateAccelerator, UI_GetOptionKeyPath, UI_GetDropTarget, UI_GetExternal, UI_TranslateUrl, UI_FilterDataObject}; HRESULT STDMETHODCALLTYPE InPlace_QueryInterface(IOleInPlaceSite FAR* This, REFIID riid, void ** ppvObject); HRESULT STDMETHODCALLTYPE InPlace_AddRef(IOleInPlaceSite FAR* This); HRESULT STDMETHODCALLTYPE InPlace_Release(IOleInPlaceSite FAR* This); HRESULT STDMETHODCALLTYPE InPlace_GetWindow(IOleInPlaceSite FAR* This, HWND FAR* lphwnd); HRESULT STDMETHODCALLTYPE InPlace_ContextSensitiveHelp(IOleInPlaceSite FAR* This, BOOL fEnterMode); HRESULT STDMETHODCALLTYPE InPlace_CanInPlaceActivate(IOleInPlaceSite FAR* This); HRESULT STDMETHODCALLTYPE InPlace_OnInPlaceActivate(IOleInPlaceSite FAR* This); HRESULT STDMETHODCALLTYPE InPlace_OnUIActivate(IOleInPlaceSite FAR* This); HRESULT STDMETHODCALLTYPE InPlace_GetWindowContext(IOleInPlaceSite FAR* This, LPOLEINPLACEFRAME FAR* lplpFrame,LPOLEINPLACEUIWINDOW FAR* lplpDoc,LPRECT lprcPosRect,LPRECT lprcClipRect,LPOLEINPLACEFRAMEINFO lpFrameInfo); HRESULT STDMETHODCALLTYPE InPlace_Scroll(IOleInPlaceSite FAR* This, SIZE scrollExtent); HRESULT STDMETHODCALLTYPE InPlace_OnUIDeactivate(IOleInPlaceSite FAR* This, BOOL fUndoable); HRESULT STDMETHODCALLTYPE InPlace_OnInPlaceDeactivate(IOleInPlaceSite FAR* This); HRESULT STDMETHODCALLTYPE InPlace_DiscardUndoState(IOleInPlaceSite FAR* This); HRESULT STDMETHODCALLTYPE InPlace_DeactivateAndUndo(IOleInPlaceSite FAR* This); HRESULT STDMETHODCALLTYPE InPlace_OnPosRectChange(IOleInPlaceSite FAR* This, LPCRECT lprcPosRect); IOleInPlaceSiteVtbl MyIOleInPlaceSiteTable = {InPlace_QueryInterface, InPlace_AddRef, InPlace_Release, InPlace_GetWindow, InPlace_ContextSensitiveHelp, InPlace_CanInPlaceActivate, InPlace_OnInPlaceActivate, InPlace_OnUIActivate, InPlace_GetWindowContext, InPlace_Scroll, InPlace_OnUIDeactivate, InPlace_OnInPlaceDeactivate, InPlace_DiscardUndoState, InPlace_DeactivateAndUndo, InPlace_OnPosRectChange}; typedef struct { IOleInPlaceSite inplace; _IOleInPlaceFrameEx frame; } _IOleInPlaceSiteEx; typedef struct { IDocHostUIHandler ui; } _IDocHostUIHandlerEx; typedef struct { IOleClientSite client; _IOleInPlaceSiteEx inplace; _IDocHostUIHandlerEx ui; } _IOleClientSiteEx; #define NOTIMPLEMENTED _ASSERT(0); return(E_NOTIMPL) //////////////////////////////////// IDocHostUIHandler functions ////////////////////////////////////// HRESULT STDMETHODCALLTYPE UI_QueryInterface(IDocHostUIHandler FAR* This, REFIID riid, LPVOID FAR* ppvObj); HRESULT STDMETHODCALLTYPE UI_AddRef(IDocHostUIHandler FAR* This); HRESULT STDMETHODCALLTYPE UI_Release(IDocHostUIHandler FAR* This); HRESULT STDMETHODCALLTYPE UI_ShowContextMenu(IDocHostUIHandler FAR* This, DWORD dwID, POINT __RPC_FAR *ppt, IUnknown __RPC_FAR *pcmdtReserved, IDispatch __RPC_FAR *pdispReserved); HRESULT STDMETHODCALLTYPE UI_GetHostInfo(IDocHostUIHandler FAR* This, DOCHOSTUIINFO __RPC_FAR *pInfo); HRESULT STDMETHODCALLTYPE UI_ShowUI(IDocHostUIHandler FAR* This, DWORD dwID, IOleInPlaceActiveObject __RPC_FAR *pActiveObject, IOleCommandTarget __RPC_FAR *pCommandTarget, IOleInPlaceFrame __RPC_FAR *pFrame, IOleInPlaceUIWindow __RPC_FAR *pDoc); HRESULT STDMETHODCALLTYPE UI_HideUI(IDocHostUIHandler FAR* This); HRESULT STDMETHODCALLTYPE UI_UpdateUI(IDocHostUIHandler FAR* This); HRESULT STDMETHODCALLTYPE UI_EnableModeless(IDocHostUIHandler FAR* This, BOOL fEnable); HRESULT STDMETHODCALLTYPE UI_OnDocWindowActivate(IDocHostUIHandler FAR* This, BOOL fActivate); HRESULT STDMETHODCALLTYPE UI_OnFrameWindowActivate(IDocHostUIHandler FAR* This, BOOL fActivate); HRESULT STDMETHODCALLTYPE UI_ResizeBorder(IDocHostUIHandler FAR* This, LPCRECT prcBorder, IOleInPlaceUIWindow __RPC_FAR *pUIWindow, BOOL fRameWindow); HRESULT STDMETHODCALLTYPE UI_TranslateAccelerator(IDocHostUIHandler FAR* This, LPMSG lpMsg, const GUID __RPC_FAR *pguidCmdGroup, DWORD nCmdID); HRESULT STDMETHODCALLTYPE UI_GetOptionKeyPath(IDocHostUIHandler FAR* This, LPOLESTR __RPC_FAR *pchKey, DWORD dw); HRESULT STDMETHODCALLTYPE UI_GetDropTarget(IDocHostUIHandler FAR* This, IDropTarget __RPC_FAR *pDropTarget, IDropTarget __RPC_FAR *__RPC_FAR *ppDropTarget); HRESULT STDMETHODCALLTYPE UI_GetExternal(IDocHostUIHandler FAR* This, IDispatch __RPC_FAR *__RPC_FAR *ppDispatch); HRESULT STDMETHODCALLTYPE UI_TranslateUrl(IDocHostUIHandler FAR* This, DWORD dwTranslate, OLECHAR __RPC_FAR *pchURLIn, OLECHAR __RPC_FAR *__RPC_FAR *ppchURLOut); HRESULT STDMETHODCALLTYPE UI_FilterDataObject(IDocHostUIHandler FAR* This, IDataObject __RPC_FAR *pDO, IDataObject __RPC_FAR *__RPC_FAR *ppDORet); ////////////////////////////////////// IOleClientSite functions ///////////////////////////////////// HRESULT STDMETHODCALLTYPE Site_QueryInterface(IOleClientSite FAR* This, REFIID riid, void ** ppvObject); HRESULT STDMETHODCALLTYPE Site_AddRef(IOleClientSite FAR* This); HRESULT STDMETHODCALLTYPE Site_Release(IOleClientSite FAR* This); HRESULT STDMETHODCALLTYPE Site_SaveObject(IOleClientSite FAR* This); HRESULT STDMETHODCALLTYPE Site_GetMoniker(IOleClientSite FAR* This, DWORD dwAssign, DWORD dwWhichMoniker, IMoniker ** ppmk); HRESULT STDMETHODCALLTYPE Site_GetContainer(IOleClientSite FAR* This, LPOLECONTAINER FAR* ppContainer); HRESULT STDMETHODCALLTYPE Site_ShowObject(IOleClientSite FAR* This); HRESULT STDMETHODCALLTYPE Site_OnShowWindow(IOleClientSite FAR* This, BOOL fShow); HRESULT STDMETHODCALLTYPE Site_RequestNewObjectLayout(IOleClientSite FAR* This); ////////////////////////////////////// IOleInPlaceSite functions ///////////////////////////////////// HRESULT STDMETHODCALLTYPE InPlace_QueryInterface(IOleInPlaceSite FAR* This, REFIID riid, LPVOID FAR* ppvObj); HRESULT STDMETHODCALLTYPE InPlace_AddRef(IOleInPlaceSite FAR* This); HRESULT STDMETHODCALLTYPE InPlace_Release(IOleInPlaceSite FAR* This); HRESULT STDMETHODCALLTYPE InPlace_GetWindow(IOleInPlaceSite FAR* This, HWND FAR* lphwnd); HRESULT STDMETHODCALLTYPE InPlace_ContextSensitiveHelp(IOleInPlaceSite FAR* This, BOOL fEnterMode); HRESULT STDMETHODCALLTYPE InPlace_CanInPlaceActivate(IOleInPlaceSite FAR* This); HRESULT STDMETHODCALLTYPE InPlace_OnInPlaceActivate(IOleInPlaceSite FAR* This); HRESULT STDMETHODCALLTYPE InPlace_OnUIActivate(IOleInPlaceSite FAR* This); HRESULT STDMETHODCALLTYPE InPlace_GetWindowContext(IOleInPlaceSite FAR* This, LPOLEINPLACEFRAME FAR* lplpFrame, LPOLEINPLACEUIWINDOW FAR* lplpDoc, LPRECT lprcPosRect, LPRECT lprcClipRect, LPOLEINPLACEFRAMEINFO lpFrameInfo); HRESULT STDMETHODCALLTYPE InPlace_Scroll(IOleInPlaceSite FAR* This, SIZE scrollExtent); HRESULT STDMETHODCALLTYPE InPlace_OnUIDeactivate(IOleInPlaceSite FAR* This, BOOL fUndoable); HRESULT STDMETHODCALLTYPE InPlace_OnInPlaceDeactivate(IOleInPlaceSite FAR* This); HRESULT STDMETHODCALLTYPE InPlace_DiscardUndoState(IOleInPlaceSite FAR* This); HRESULT STDMETHODCALLTYPE InPlace_DeactivateAndUndo(IOleInPlaceSite FAR* This); HRESULT STDMETHODCALLTYPE InPlace_OnPosRectChange(IOleInPlaceSite FAR* This, LPCRECT lprcPosRect); ////////////////////////////////////// IOleInPlaceFrame functions ///////////////////////////////////////// HRESULT STDMETHODCALLTYPE Frame_QueryInterface(IOleInPlaceFrame FAR* This, REFIID riid, LPVOID FAR* ppvObj); HRESULT STDMETHODCALLTYPE Frame_AddRef(IOleInPlaceFrame FAR* This); HRESULT STDMETHODCALLTYPE Frame_Release(IOleInPlaceFrame FAR* This); HRESULT STDMETHODCALLTYPE Frame_GetWindow(IOleInPlaceFrame FAR* This, HWND FAR* lphwnd); HRESULT STDMETHODCALLTYPE Frame_ContextSensitiveHelp(IOleInPlaceFrame FAR* This, BOOL fEnterMode); HRESULT STDMETHODCALLTYPE Frame_GetBorder(IOleInPlaceFrame FAR* This, LPRECT lprectBorder); HRESULT STDMETHODCALLTYPE Frame_RequestBorderSpace(IOleInPlaceFrame FAR* This, LPCBORDERWIDTHS pborderwidths); HRESULT STDMETHODCALLTYPE Frame_SetBorderSpace(IOleInPlaceFrame FAR* This, LPCBORDERWIDTHS pborderwidths); HRESULT STDMETHODCALLTYPE Frame_SetActiveObject(IOleInPlaceFrame FAR* This, IOleInPlaceActiveObject *pActiveObject, LPCOLESTR pszObjName); HRESULT STDMETHODCALLTYPE Frame_InsertMenus(IOleInPlaceFrame FAR* This, HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths); HRESULT STDMETHODCALLTYPE Frame_SetMenu(IOleInPlaceFrame FAR* This, HMENU hmenuShared, HOLEMENU holemenu, HWND hwndActiveObject); HRESULT STDMETHODCALLTYPE Frame_RemoveMenus(IOleInPlaceFrame FAR* This, HMENU hmenuShared); HRESULT STDMETHODCALLTYPE Frame_SetStatusText(IOleInPlaceFrame FAR* This, LPCOLESTR pszStatusText); HRESULT STDMETHODCALLTYPE Frame_EnableModeless(IOleInPlaceFrame FAR* This, BOOL fEnable); HRESULT STDMETHODCALLTYPE Frame_TranslateAccelerator(IOleInPlaceFrame FAR* This, LPMSG lpmsg, WORD wID); ////////////////////////////////////// Main functions //////////////////////////////////////////////////// #define WEBPAGE_GOBACK 0 #define WEBPAGE_GOFORWARD 1 #define WEBPAGE_GOHOME 2 #define WEBPAGE_SEARCH 3 #define WEBPAGE_REFRESH 4 #define WEBPAGE_STOP 5 void UnEmbedBrowserObject(HWND hwnd, PCHAR ptrObject); void DoPageAction(HWND hwnd, PCHAR ptrObject, DWORD action); long DisplayHTMLStr(HWND hwnd, PCHAR ptrObject, PWCHAR string); long DisplayHTMLPage(HWND hwnd, PCHAR ptrObject, PWCHAR webPageName); void ResizeBrowser(HWND hwnd, PCHAR ptrObject, DWORD width, DWORD height); long EmbedBrowserObject(HWND hwnd, PCHAR *outObject); #endif
PreHeader.h
#ifndef _INCLUDE_PRE_HEADER_FILE_H_ #define _INCLUDE_PRE_HEADER_FILE_H_ #pragma once #include <ole2.h> #define WEBPAGE_GOBACK 0 #define WEBPAGE_GOFORWARD 1 #define WEBPAGE_GOHOME 2 #define WEBPAGE_SEARCH 3 #define WEBPAGE_REFRESH 4 #define WEBPAGE_STOP 5 extern "C" { void UnEmbedBrowserObject(HWND hwnd, PCHAR ptrObject); void DoPageAction(HWND hwnd, PCHAR ptrObject, DWORD action); long DisplayHTMLStr(HWND hwnd, PCHAR ptrObject, PWCHAR string); long DisplayHTMLPage(HWND hwnd, PCHAR ptrObject, PWCHAR webPageName); void ResizeBrowser(HWND hwnd, PCHAR ptrObject, DWORD width, DWORD height); long EmbedBrowserObject(HWND hwnd, PCHAR *outObject); }; #endif
WebBrowser.h
// Webbrowser.h: interface for the CWebbrowser class. // ////////////////////////////////////////////////////////////////////// #ifndef _INCLUDE_WEBBROWSER_FILE_H_ #define _INCLUDE_WEBBROWSER_FILE_H_ #pragma once #define WIN32_LEAN_AND_MEAN #include <Windows.h> #include <oleidl.h> ////////////////////////////////////////////////////////////////////////// // 使用前调用OleInitialize初始化OLE enum _PAGE_ACT { PAGE_GOBACK, //后退 PAGE_GOFORWARD, //前进 PAGE_GOHOME, //主页 PAGE_SEARCH, //搜索 PAGE_REFRESH, //刷新 PAGE_STOP //停止 }; class CWebbrowser { public: CWebbrowser(HWND/*窗体句柄(IE控件的容器)*/); virtual ~CWebbrowser(); private: HWND m_hDlg; PCHAR m_pObject; public: VOID ReSize(DWORD dwWidth, DWORD dwHeight); //调整大小 LONG DisplayByStr(PWCHAR pUnicodeString); //以HTML代码形式显示 LONG OpenUrl(PWCHAR pUnicodeString); //打开地址/文件 VOID DoAction(_PAGE_ACT eAct); //行为(前进/后退/刷新/停止) IOleObject* GetObject(); }; #endif
编译方法:
用记事本把上面的几份代码保存为相应的文件,打开VC6.0新建一个空的static Library工程,把这几个文件添加进去,编译即可。
使用方法:(示例代码)
空WIN32工程。添加一个CPP文件,写入以下内容。
#define WIN32_LEAN_AND_MEAN #include <windows.h> ////////////////////////////////////////////////////////////////////////// #include "Webbrowser.h" #pragma comment(lib, "Webbrowser.lib") ////////////////////////////////////////////////////////////////////////// static const TCHAR ClassName[] = "Browser Example"; LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { if (uMsg == WM_CLOSE) ExitProcess(0); return DefWindowProc(hwnd, uMsg, wParam, lParam); } int CALLBACK 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, 0))) { CWebbrowser *cWeb = new CWebbrowser(msg.hwnd); cWeb->OpenUrl(L"http://www.baidu.com/"); 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(-1); }
未解决问题:
在网页内单击鼠标右键无效,Ctrl+C,Ctrl+V无效。
等等......
相关帖子链接:
http://topic.csdn.net/u/20110610/05/630647b9-cad8-4df4-abe5-ad6076ff2fa4.html