IE 实现代码示例
IE 是 CE 的一个标准功能,但 很多人想定制 IE 浏览器,以实现某此特殊的需求。
以早以前看过 MS 提供的 IE 示例,研究了一下,现将代码分享出来,大家一起学习。
需要注意的是,IESIMPLE 做为窗体的类名不能修改,详细见代码中的注释。
resource.h 头文件:
1 // 2 // Copyright (c) Microsoft Corporation. All rights reserved. 3 // 4 // 5 // Use of this source code is subject to the terms of the Microsoft end-user 6 // license agreement (EULA) under which you licensed this SOFTWARE PRODUCT. 7 // If you did not accept the terms of the EULA, you are not authorized to use 8 // this source code. For a copy of the EULA, please see the LICENSE.RTF on your 9 // install media. 10 // 11 #define IDC_STATIC -1 12 13 #define IDR_ACCELERATOR 100 14 15 #define IDD_OPEN_DIALOG 1000 16 17 #define IDC_URL_EDIT 3000 18 #define IDC_BROWSE 3001 19 #define IDC_NEWWINDOW 3002 20 21 #define IDS_IE 20000 22 #define IDS_ADDRESS 20001 23 #define IDS_FILESCHEME 20002 24 #define IDS_HYPHEN 20003 25 #define IDS_BROWSEFILTER 20010 26 27 #define ID_VIEW_STOP 500 28 #define ID_VIEW_REFRESH 501 29 #define ID_GO_BACK 502 30 #define ID_GO_FORWARD 503 31 #define ID_FOCUS_URL 504 32 #define ID_OPEN 505 33 #define ID_GO_HOME 506 34 #define ID_GO_SEARCH 507 35 #define ID_FULLSCREEN 508 36 #define ID_INTERNET_OPTIONS 509 37 #define ID_FIND 510 38 #define ID_CLOSE 511 39 #define ID_ZOOMUP 512 40 #define ID_ZOOMDOWN 513
mainwnd.h 头文件:
1 // 2 // Copyright (c) Microsoft Corporation. All rights reserved. 3 // 4 // 5 // Use of this source code is subject to the terms of the Microsoft end-user 6 // license agreement (EULA) under which you licensed this SOFTWARE PRODUCT. 7 // If you did not accept the terms of the EULA, you are not authorized to use 8 // this source code. For a copy of the EULA, please see the LICENSE.RTF on your 9 // install media. 10 // 11 /*++ 12 THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF 13 ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO 14 THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A 15 PARTICULAR PURPOSE. 16 17 Module Name: mainwnd.h 18 19 Abstract: Implements the main window, the container for the webbrowser 20 21 Functions: 22 23 Notes: This class implements the container and its interaction with the webbrowser control, 24 commandbar, statusbar etc. 25 26 27 --*/ 28 29 #ifndef _MAINWND_H 30 #define _MAINWND_H_ 31 32 #include "mshtmhst.h" 33 #include "interned.h" 34 35 #define MAX_URL 2048 36 37 class CMainWnd : 38 public IOleContainer, 39 public IOleClientSite, 40 public IOleInPlaceSite, 41 public IServiceProvider, 42 public DWebBrowserEvents2, 43 public IDocHostUIHandler, 44 public IDocHostShowUI, // msgbox, help window 45 public IHTMLOMWindowServices // for window move, resize events 46 { 47 48 public: 49 CMainWnd(); 50 ~CMainWnd(); 51 52 BOOL Create(); 53 54 //IUnknown methods 55 STDMETHOD(QueryInterface) (REFIID riid, LPVOID * ppv) 56 { 57 if ((riid == IID_IOleContainer) || (riid == IID_IUnknown)) 58 { 59 *ppv = (IOleContainer *) this; 60 } 61 else if (riid == IID_IOleClientSite) 62 { 63 *ppv = (IOleClientSite *)this; 64 } 65 else if (riid == IID_IOleInPlaceSite) 66 { 67 *ppv = (IOleInPlaceSite *)this; 68 } 69 else if (riid == IID_IOleWindow) 70 { 71 *ppv = (IOleWindow *)this; 72 } 73 else if ((riid == DIID_DWebBrowserEvents2) || (riid == IID_IDispatch)) 74 { 75 *ppv = (DWebBrowserEvents2 *)this; 76 } 77 else if(riid == IID_IServiceProvider) 78 { 79 *ppv = (IServiceProvider *)this; 80 } 81 else if (riid == IID_IDocHostUIHandler) 82 { 83 *ppv = (IDocHostUIHandler *)this; 84 } 85 else if (riid == IID_IDocHostShowUI) 86 { 87 *ppv = (IDocHostShowUI *)this; 88 } 89 else if (riid == IID_IHTMLOMWindowServices) 90 { 91 *ppv = (IHTMLOMWindowServices *)this; 92 } 93 else 94 { 95 *ppv = NULL; 96 return E_NOINTERFACE; 97 } 98 AddRef(); 99 return S_OK; 100 } 101 102 STDMETHOD_(ULONG, AddRef) (void) 103 { 104 InterlockedIncrement((LONG*)&m_unRefs); 105 return m_unRefs; 106 } 107 108 STDMETHOD_(ULONG, Release) (void) 109 { 110 ULONG ulRefs = m_unRefs; 111 if (InterlockedDecrement((LONG*)&m_unRefs) == 0) 112 { 113 delete this; 114 return 0; 115 } 116 return ulRefs - 1; 117 } 118 119 // IOleContainer methods 120 STDMETHOD(ParseDisplayName)(IBindCtx *, LPOLESTR, ULONG *, IMoniker **) { return E_NOTIMPL;} 121 STDMETHOD(EnumObjects)(DWORD, IEnumUnknown **) 122 { 123 return E_NOTIMPL; 124 } 125 STDMETHOD(LockContainer)(BOOL) { return S_OK;} 126 127 // IOleClientSite methods 128 STDMETHOD(SaveObject) (void) { return E_NOTIMPL;} 129 STDMETHOD(GetMoniker) (DWORD dwAssign, DWORD dwWhichMoniker, LPMONIKER * ppmk) { return E_NOTIMPL;} 130 STDMETHOD(GetContainer) (LPOLECONTAINER * ppContainer) 131 { 132 return E_NOINTERFACE; 133 } 134 STDMETHOD(ShowObject) (void) { return E_NOTIMPL;} 135 STDMETHOD(OnShowWindow) (BOOL fShow) { return E_NOTIMPL;} 136 STDMETHOD(RequestNewObjectLayout) (void) { return E_NOTIMPL;} 137 138 // IOleWindow methods 139 STDMETHOD(GetWindow)(HWND *phwnd) 140 { 141 *phwnd = m_hWndMain; 142 return S_OK; 143 } 144 STDMETHOD(ContextSensitiveHelp)(BOOL fEnterMode) { return E_NOTIMPL;} 145 146 // IOleInPlaceSite methods 147 STDMETHOD(CanInPlaceActivate) (void) { return S_OK;} 148 STDMETHOD(OnInPlaceActivate) (void) 149 { 150 m_bInPlaceActive = TRUE; 151 return S_OK; 152 } 153 154 STDMETHOD(OnUIActivate) (void) { return E_NOTIMPL;} 155 STDMETHOD(GetWindowContext) ( 156 LPOLEINPLACEFRAME FAR * lplpFrame, 157 LPOLEINPLACEUIWINDOW FAR * lplpDoc, 158 LPRECT lprcPosRect, 159 LPRECT lprcClipRect, 160 LPOLEINPLACEFRAMEINFO lpFrameInfo) 161 { 162 163 GetClientRect(m_hWndMain, lprcPosRect); 164 GetClientRect(m_hWndMain, lprcClipRect); 165 166 return S_OK; 167 } 168 169 STDMETHOD(Scroll) (SIZE scrollExtent) { return E_NOTIMPL;} 170 STDMETHOD(OnUIDeactivate) (BOOL fUndoable) { return E_NOTIMPL;} 171 STDMETHOD(OnInPlaceDeactivate) (void) 172 { 173 m_bInPlaceActive = FALSE; 174 return S_OK; 175 } 176 177 STDMETHOD(DiscardUndoState) (void) { return E_NOTIMPL;} 178 STDMETHOD(DeactivateAndUndo) (void) { return E_NOTIMPL;} 179 STDMETHOD(OnPosRectChange) (LPCRECT lprcPosRect) { return E_NOTIMPL;} 180 181 // IServiceProvider 182 183 STDMETHOD(QueryService)(REFGUID guidService, REFIID riid, void **ppvObj) 184 { 185 if(guidService == IID_IHTMLOMWindowServices) 186 { 187 return QueryInterface(riid, ppvObj); 188 } 189 else 190 return E_FAIL; 191 } 192 193 //DWebBrowserEvents 194 //IDispatch methods 195 STDMETHOD(GetTypeInfoCount)(UINT FAR* pctinfo) { return E_NOTIMPL;} 196 197 STDMETHOD(GetTypeInfo)(UINT itinfo,LCID lcid,ITypeInfo FAR* FAR* pptinfo) { return E_NOTIMPL;} 198 199 STDMETHOD(GetIDsOfNames)(REFIID riid,OLECHAR FAR* FAR* rgszNames,UINT cNames, 200 LCID lcid, DISPID FAR* rgdispid) { return E_NOTIMPL;} 201 202 STDMETHOD(Invoke)(DISPID dispidMember,REFIID riid,LCID lcid,WORD wFlags, 203 DISPPARAMS FAR* pdispparams, VARIANT FAR* pvarResult, 204 EXCEPINFO FAR* pexcepinfo,UINT FAR* puArgErr); 205 206 // IDocHostUIHandler methods 207 STDMETHOD(EnableModeless)(BOOL fEnable) { return E_NOTIMPL; } 208 STDMETHOD(FilterDataObject)(IDataObject *pDO, IDataObject **ppDORet) { return E_NOTIMPL; } 209 STDMETHOD(GetDropTarget)(IDropTarget *pDropTarget, IDropTarget **ppDropTarget) { return E_NOTIMPL; } 210 STDMETHOD(GetExternal)(IDispatch **ppDispatch) { return E_NOTIMPL; } 211 STDMETHOD(GetHostInfo)(DOCHOSTUIINFO *pInfo); 212 STDMETHOD(GetOptionKeyPath)(LPOLESTR *pchKey, DWORD dw) { return E_NOTIMPL; } 213 STDMETHOD(HideUI)(void) { return E_NOTIMPL; } 214 STDMETHOD(OnDocWindowActivate)(BOOL fActivate) { return E_NOTIMPL; } 215 STDMETHOD(OnFrameWindowActivate)(BOOL fActivate) { return E_NOTIMPL; } 216 STDMETHOD(ResizeBorder)(LPCRECT prcBorder, IOleInPlaceUIWindow *pUIWindow, BOOL fFrameWindow) { return E_NOTIMPL; } 217 STDMETHOD(ShowContextMenu)(DWORD dwID, POINT *ppt, IUnknown *pcmdtReserved, IDispatch *pdispReserved) { return E_NOTIMPL; } 218 STDMETHOD(ShowUI)(DWORD dwID, IOleInPlaceActiveObject *pActiveObject, 219 IOleCommandTarget *pCommandTarget, IOleInPlaceFrame *pFrame, 220 IOleInPlaceUIWindow *pDoc) { return E_NOTIMPL; } 221 STDMETHOD(TranslateAccelerator)(LPMSG lpMsg, const GUID *pgudCmdGroup, DWORD nCmdID) { return E_NOTIMPL; } 222 STDMETHOD(TranslateUrl)(DWORD dwTranslate, OLECHAR *pchURLIn, OLECHAR **ppchURLOut) { return E_NOTIMPL; } 223 STDMETHOD(UpdateUI)(void) { return E_NOTIMPL; } 224 225 // IDocHostShowUI methods 226 STDMETHOD(ShowHelp)( HWND hwnd, LPOLESTR pszHelpFile, UINT uCommand, 227 DWORD dwData, POINT ptMouse, IDispatch *pDispatchObjectHit) 228 { return E_NOTIMPL; } 229 230 231 STDMETHOD(ShowMessage)( HWND hwnd, LPOLESTR lpstrText, LPOLESTR lpstrCaption, DWORD dwType, 232 LPOLESTR lpstrHelpFile, DWORD dwHelpContext, LRESULT *plResult) 233 { 234 int iRes = MessageBox(hwnd, lpstrText, lpstrCaption, dwType); 235 if(plResult) 236 *plResult = iRes; 237 return S_OK; 238 } 239 240 // IHTMLOMWindowServices methods 241 STDMETHOD(moveTo)( LONG x, LONG y); 242 STDMETHOD(moveBy)( LONG x, LONG y); 243 STDMETHOD(resizeTo)( LONG x,LONG y); 244 STDMETHOD(resizeBy)( LONG x, LONG y); 245 246 247 public: 248 BOOL PreTranslateMessage(LPMSG pMsg); 249 VOID Close(); 250 HWND GetWindow() { return m_hWndMain;} 251 LRESULT HandleCommand(WPARAM wParam, LPARAM lParam); 252 253 HANDLE m_hEvent; 254 IWebBrowser2 *m_pBrowser; 255 256 257 258 static LRESULT CALLBACK MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam); 259 260 protected: 261 262 263 264 //Added for HTML Find Dialogs 265 HRESULT FindString(); 266 267 VOID CMainWnd::ChangeFontSize(BOOL fInit); 268 269 BOOL RegisterMainWnd(); 270 HWND CreateBrowser(); 271 HRESULT Activate(IOleObject *pObject); 272 HRESULT InitEvents(); 273 274 275 public: 276 LPTSTR m_lpszUrl; 277 BOOL m_bEmpty; 278 BOOL m_bFullScreen; 279 RECT m_rcWnd; 280 protected: 281 HACCEL m_hAccelTbl; //a handle to the accelerator table 282 HWND m_hWndMain; //the main window 283 284 ULONG m_unRefs; //reference count for the interfaces supported by the container 285 286 HWND m_hWndBrowser; //handle to the browser window 287 288 IOleObject *m_pObject; 289 IConnectionPoint *m_pCP; 290 IOleInPlaceActiveObject *m_pIPActiveObj; 291 BOOL m_bInPlaceActive; 292 DWORD m_dwEventCookie; 293 294 TCHAR m_tcTitle[MAX_URL]; //title of the current document 295 HWND m_hWndProgress; // progress bar 296 RECT m_rcProgress; 297 298 int m_iZoom; 299 int m_iDLCCounter; 300 301 }; 302 303 #endif //_MAINWND_H_
mainwnd.cpp 源文件:
1 /*++ 2 3 Module Name: mainwnd.cpp 4 5 Abstract: Implements the main window, the container for the webbrowser 6 7 Functions: 8 9 Notes: Most of the code resides here. The container and its interaction with the webbrowser control, 10 commandbar, statusbar etc. 11 12 13 --*/ 14 #include <windows.h> 15 // Include the automation definitions... 16 #include <exdisp.h> 17 #include <exdispid.h> 18 #include <mshtmdid.h> // AMBIENT_DLCONTROL 19 20 #include <objbase.h> 21 22 #include <tchar.h> 23 24 #include <wininet.h> 25 #include <afdfunc.h> //ras stuff 26 #include <pkfuncs.h> // GetOwnerProcess 27 #include <mshtml.h> 28 #include <commctrl.h> 29 #include <commdlg.h> 30 #include "MainWnd.h" 31 #include "resource.h" 32 33 #define INITGUID 34 #include "initguid.h" 35 #include <hshell.h> 36 37 #define START_FULLSCREEN // Remove this if you don't want IESIMPLE to be full-screen at startup 38 39 DEFINE_GUID(CLSID_WebBrowser, 0x8856F961L, 0x340A, 0x11D0, 0xA9, 0x6B, 0x00, 0xC0, 0x4F, 0xD7, 0x05, 0xA2); 40 DEFINE_GUID(IID_IWebBrowser, 0xEAB22AC1L, 0x30C1, 0x11CF, 0xA7, 0xEB, 0x00, 0x00, 0xC0, 0x5B, 0xAE, 0x0B); 41 DEFINE_GUID(IID_IWebBrowser2, 0xD30C1661L, 0xCDAF, 0x11D0, 0x8A, 0x3E, 0x00, 0xC0, 0x4F, 0xC9, 0xE2, 0x6E); 42 DEFINE_GUID(DIID_DWebBrowserEvents, 0xEAB22AC2L, 0x30C1, 0x11CF, 0xA7, 0xEB, 0x00, 0x00, 0xC0, 0x5B, 0xAE, 0x0B); 43 DEFINE_GUID(DIID_DWebBrowserEvents2, 0x34A715A0L, 0x6587, 0x11D0, 0x92, 0x4A, 0x00, 0x20, 0xAF, 0xC7, 0xAC, 0x4D); 44 DEFINE_GUID(IID_IWebBrowserApp, 0x0002DF05L, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46); 45 46 const GUID SID_SDocHost = { 0xc6504990, 0xd43e, 0x11cf, { 0x89, 0x3b, 0x00, 0xaa, 0x00, 0xbd, 0xce, 0x1a}}; 47 48 #define MAX(a,b) (a > b) ? a : b 49 #define MIN(a,b) (a > b) ? b : a 50 51 LONG glThreadCount = 0; 52 HWND ghWndAddressEdit= NULL; 53 HANDLE ghExitEvent = NULL; 54 HINSTANCE g_hInstance = NULL; 55 DWORD g_dwMainWindowStackSize = 0x20000; 56 57 void GetProxyOption(); 58 59 60 static HRESULT FindString(); 61 HRESULT HandleNewWindow2(LPTSTR lpszUrl, DISPPARAMS FAR* pdparams); 62 BOOL RegisterMainWnd(); 63 64 65 DWORD WINAPI NewWindow(LPVOID pParam) 66 { 67 CMainWnd *pWnd = (CMainWnd *)pParam; 68 MSG msg; 69 BOOL fRet; 70 71 HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); 72 73 fRet = pWnd->Create(); 74 75 SetEvent(pWnd->m_hEvent); 76 77 if(!fRet) 78 { 79 pWnd->m_pBrowser = NULL; 80 return 0; 81 } 82 83 while(GetMessage( &msg, NULL, 0, 0 ) ) 84 { 85 if(msg.message == WM_QUIT) 86 break; 87 88 if(!pWnd->PreTranslateMessage(&msg) && !(msg.message == WM_CHAR && msg.wParam == VK_TAB)) 89 { 90 TranslateMessage(&msg); 91 DispatchMessage(&msg); 92 } 93 } 94 95 pWnd->Release(); 96 97 CoUninitialize(); 98 99 InterlockedDecrement(&glThreadCount); 100 SetEvent(ghExitEvent); 101 102 return msg.wParam; 103 } 104 105 int APIENTRY WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPTSTR lpCmdLine, int nCmdShow) 106 { 107 INITCOMMONCONTROLSEX iccsex; 108 HKEY hKey; 109 DWORD dwSize = sizeof(DWORD); 110 MSG msg; 111 112 // HKCU is where IE\Main settings are 113 if(ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("SOFTWARE\\Microsoft\\Internet Explorer\\Main"), 0, 0, &hKey)) 114 { 115 RegQueryValueEx(hKey, TEXT("StackRes"), NULL, NULL, (LPBYTE)&g_dwMainWindowStackSize, &dwSize); 116 RegCloseKey(hKey); 117 } 118 119 // provide a default stack size if the one given is too small or too large. 120 if(g_dwMainWindowStackSize < 0x10000 || g_dwMainWindowStackSize > 0x80000) 121 { 122 // default to 128k 123 g_dwMainWindowStackSize = 0x20000; 124 } 125 RETAILMSG(1,(L"IESIMPLE Using Stack size: 0x%x\r\n", g_dwMainWindowStackSize)); 126 127 HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); 128 if(FAILED(hr)) 129 { 130 return FALSE; 131 } 132 133 if(!RegisterMainWnd()) 134 { 135 return FALSE; 136 } 137 138 ghExitEvent = CreateEvent(NULL, FALSE, FALSE, NULL); 139 if(!ghExitEvent) 140 { 141 return FALSE; 142 } 143 144 iccsex.dwSize = sizeof(INITCOMMONCONTROLSEX); 145 iccsex.dwICC = ICC_COOL_CLASSES; 146 147 InitCommonControlsEx(&iccsex); 148 149 g_hInstance = hInst; 150 151 // Create a message queue on this thread 152 PeekMessage(&msg, NULL, 0,0,PM_NOREMOVE); 153 154 if(FAILED(HandleNewWindow2(lpCmdLine, NULL))) 155 { 156 goto Cleanup; 157 } 158 159 while(glThreadCount > 0) 160 { 161 WaitForSingleObject(ghExitEvent, INFINITE); 162 } 163 164 Cleanup: 165 CoUninitialize(); 166 167 RETAILMSG(1, (L"IESIMPLE exited. Cmdline was: %s\r\n",lpCmdLine ? lpCmdLine : L"")); 168 169 return TRUE; 170 } 171 172 173 CMainWnd::CMainWnd() 174 { 175 m_unRefs = 1; 176 m_hWndMain = NULL; 177 m_pBrowser = NULL; 178 m_pObject = NULL; 179 m_pCP = NULL; 180 m_lpszUrl = NULL; 181 m_bFullScreen = FALSE; 182 m_bEmpty = FALSE; 183 m_tcTitle[0] = 0; 184 185 m_iZoom = 2; // default zoom 186 m_iDLCCounter = 0; // counter for Download Completes 187 188 } 189 190 CMainWnd::~CMainWnd() 191 { 192 RETAILMSG(1,(L"IESIMPLE Exiting ~CMainWnd\r\n")); 193 194 if(m_pBrowser) 195 m_pBrowser->Release(); 196 } 197 198 BOOL RegisterMainWnd() 199 { 200 WNDCLASS wc; 201 wc.style = 0; 202 wc.lpfnWndProc = (WNDPROC)CMainWnd::MainWndProc; 203 wc.cbClsExtra = 0; 204 wc.cbWndExtra = 0; 205 wc.hInstance = g_hInstance; 206 wc.hIcon = NULL; // LoadIcon(g_hInstance, MAKEINTRESOURCE(IDI_IE)); 207 wc.hCursor = LoadCursor(NULL, IDC_ARROW); 208 wc.hbrBackground = (HBRUSH)GetSysColorBrush(COLOR_WINDOW); 209 wc.lpszMenuName = NULL; 210 wc.lpszClassName = TEXT("IESIMPLE"); 211 212 if(!(RegisterClass(&wc))) 213 return FALSE; 214 215 return TRUE; 216 } 217 218 219 BOOL CMainWnd::Create() 220 { 221 RECT rcArea; 222 DWORD dwTick; 223 224 DWORD dwStyle = WS_VISIBLE | WS_OVERLAPPED | WS_THICKFRAME | WS_SYSMENU; 225 /*|WS_OVERLAPPED|WS_BORDER|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX*/ 226 DWORD dwExStyle = 0/*WS_EX_OVERLAPPEDWINDOW*/; 227 228 HMENU hMenu = NULL; 229 230 SystemParametersInfo(SPI_GETWORKAREA, 0, &rcArea, 0); 231 232 m_hWndMain = ::CreateWindowEx(dwExStyle, 233 TEXT("IESIMPLE"), // Add ZH - Leo 不能修改此名称,否则创建窗体失败 234 (WCHAR *)LoadString(g_hInstance, IDS_IE, NULL, 0), 235 dwStyle, 236 rcArea.left + 20, 237 rcArea.top + 20, 238 rcArea.right - rcArea.left - 40, 239 rcArea.bottom - rcArea.top - 30, 240 NULL, hMenu, g_hInstance, 0); 241 if(!m_hWndMain) 242 { 243 return FALSE; 244 } 245 246 SetWindowLong(m_hWndMain, GWL_USERDATA, (DWORD)this); 247 GetWindowRect(m_hWndMain, &m_rcWnd); 248 249 // create a progress bar 250 m_rcProgress.left = 5; 251 m_rcProgress.right = m_rcProgress.left + (m_rcWnd.right - m_rcWnd.left)/3; 252 m_rcProgress.top = 5; 253 m_rcProgress.bottom = m_rcProgress.top + 15; 254 255 m_hWndProgress = CreateWindowEx(WS_EX_NOACTIVATE, PROGRESS_CLASS, _T(""), WS_CHILD|PBS_SMOOTH|WS_BORDER, 256 m_rcProgress.left, m_rcProgress.top, m_rcProgress.right-m_rcProgress.left, m_rcProgress.bottom-m_rcProgress.top, 257 m_hWndMain, NULL, g_hInstance, NULL); 258 if(m_hWndProgress) 259 { 260 SendMessage(m_hWndProgress, PBM_SETRANGE32, 0, 1000); 261 } 262 // /progress bar 263 264 dwTick = GetTickCount(); 265 if(!(m_hWndBrowser = CreateBrowser())) 266 return FALSE; 267 RETAILMSG(1,(L"Create browser tick count: %d\r\n",GetTickCount() - dwTick)); // 约 2 秒 268 269 // LONG lStyle = GetWindowLong(_hWndBrowser, GWL_STYLE); 270 // SetWindowLong(_hWndBrowser, GWL_STYLE, lStyle|WS_BORDER); 271 272 SetFocus(m_hWndMain); 273 274 m_hAccelTbl = LoadAccelerators(g_hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR)); 275 276 #ifdef START_FULLSCREEN 277 HandleCommand( ID_FULLSCREEN, 0 ); 278 #endif 279 280 return TRUE; 281 } 282 283 284 285 void GetProxyOption() 286 { 287 INTERNET_PER_CONN_OPTION_LIST iOptionList; 288 INTERNET_PER_CONN_OPTION iOptions[3]; 289 ULONG uSize = sizeof(iOptionList); 290 291 iOptionList.dwSize = uSize; 292 iOptionList.pszConnection = NULL; 293 iOptionList.dwOptionCount = 3; 294 iOptionList.pOptions = iOptions; 295 296 // set proxy type direct or proxy server 297 iOptions[0].dwOption = INTERNET_PER_CONN_FLAGS; 298 iOptions[1].dwOption = INTERNET_PER_CONN_PROXY_SERVER; 299 iOptions[2].dwOption = INTERNET_PER_CONN_PROXY_BYPASS; 300 301 if(InternetQueryOption(NULL,INTERNET_OPTION_PER_CONNECTION_OPTION ,(LPVOID)(&iOptionList),&uSize)) 302 { 303 GlobalFree(iOptionList.pOptions[1].Value.pszValue); 304 GlobalFree(iOptionList.pOptions[2].Value.pszValue); 305 } 306 } 307 308 HWND CMainWnd::CreateBrowser() 309 { 310 HRESULT hr; 311 IUnknown *pUnk = NULL; 312 IOleObject *pObject = NULL; 313 314 if(!m_pBrowser) 315 { 316 GetProxyOption(); 317 hr = CoCreateInstance(CLSID_WebBrowser, NULL, 318 CLSCTX_INPROC_SERVER | CLSCTX_INPROC_HANDLER, 319 IID_IUnknown, (LPVOID *)(&pUnk)); 320 if(FAILED(hr)) 321 return FALSE; 322 323 hr = pUnk->QueryInterface(IID_IOleObject, (LPVOID *)(&pObject)); 324 if(FAILED(hr)) 325 goto Cleanup; 326 327 DWORD dwFlags; 328 hr = pObject->GetMiscStatus(DVASPECT_CONTENT, &dwFlags); 329 if(FAILED(hr)) 330 goto Cleanup; 331 332 if(dwFlags & OLEMISC_SETCLIENTSITEFIRST) 333 { 334 IOleClientSite *pClientSite; 335 hr = QueryInterface(IID_IOleClientSite, (LPVOID *)(&pClientSite)); 336 if(FAILED(hr)) 337 goto Cleanup; 338 339 hr = pObject->SetClientSite(pClientSite); 340 pClientSite->Release(); 341 if(FAILED(hr)) 342 goto Cleanup; 343 } 344 345 hr = Activate(pObject); 346 if(FAILED(hr)) 347 goto Cleanup; 348 349 hr = m_pObject->QueryInterface(IID_IWebBrowser2, (void **)&m_pBrowser); 350 if(FAILED(hr)) 351 goto Cleanup; 352 353 // See if there might be a url in lpszUrl 354 hr = pUnk->QueryInterface(IID_IOleInPlaceActiveObject, (LPVOID *)(&m_pIPActiveObj)); 355 if(FAILED(hr)) 356 m_pIPActiveObj = NULL; 357 358 hr = S_FALSE; 359 360 if(m_bEmpty) 361 { 362 // Leo Test: m_lpszUrl = L"http://www.baidu.com"; 363 364 BSTR bstrURL = SysAllocString(m_lpszUrl); 365 if(bstrURL && bstrURL[0]) 366 m_pBrowser->Navigate(bstrURL, NULL, NULL, NULL, NULL); 367 else 368 m_pBrowser->GoHome(); 369 370 SysFreeString(bstrURL); 371 372 } 373 hr = InitEvents(); 374 } 375 376 Cleanup: 377 if(pUnk) 378 pUnk->Release(); 379 if(pObject) 380 pObject->Release(); 381 382 IOleWindow *pWnd = NULL; 383 HWND hwndBrowser = NULL; 384 385 if(m_pBrowser) 386 { 387 hr = m_pBrowser->QueryInterface(IID_IOleWindow, (LPVOID *)(&pWnd)); 388 if(FAILED(hr)) 389 return NULL; 390 } 391 392 if(pWnd) 393 { 394 hr = pWnd->GetWindow(&hwndBrowser); 395 pWnd->Release(); 396 } 397 return hwndBrowser; 398 } 399 400 HRESULT CMainWnd::Activate(IOleObject *pObject) 401 { 402 m_pObject = pObject; 403 m_pObject->AddRef(); 404 405 RECT rc; 406 ::GetClientRect(m_hWndMain, &rc); 407 408 HRESULT hr; 409 hr = m_pObject->DoVerb( OLEIVERB_UIACTIVATE, NULL, this, 0, m_hWndMain, &rc); 410 411 if(FAILED(hr)) 412 goto Cleanup; 413 414 Cleanup: 415 return hr; 416 } 417 418 HRESULT CMainWnd::InitEvents() 419 { 420 HRESULT hr; 421 IConnectionPointContainer *pCPCont = NULL; 422 DWebBrowserEvents *pEvents = NULL; 423 424 if(!m_pBrowser) 425 return S_FALSE; 426 hr = m_pBrowser->QueryInterface(IID_IConnectionPointContainer, (LPVOID *)&pCPCont); 427 if(FAILED(hr)) 428 return S_FALSE; 429 hr = pCPCont->FindConnectionPoint(DIID_DWebBrowserEvents2, &m_pCP); 430 if(FAILED(hr)) 431 { 432 m_pCP = NULL; 433 goto Cleanup; 434 } 435 436 hr = QueryInterface(DIID_DWebBrowserEvents2, (LPVOID *)(&pEvents)); 437 if(FAILED(hr)) 438 goto Cleanup; 439 hr = m_pCP->Advise(pEvents, &(m_dwEventCookie)); 440 if(FAILED(hr)) 441 goto Cleanup; 442 443 444 Cleanup: 445 if(pCPCont) 446 pCPCont->Release(); 447 if(pEvents) 448 pEvents->Release(); 449 return hr; 450 } 451 452 453 454 HRESULT HandleNewWindow2(LPTSTR lpszUrl, DISPPARAMS FAR* pdparams) 455 { 456 HANDLE hThread; 457 CMainWnd *pNewWnd; 458 IDispatch *pDispatch; 459 HRESULT hr = S_OK; 460 DWORD dwThreadID = 0; 461 462 pNewWnd = new CMainWnd; 463 464 if(!pNewWnd) 465 { 466 return E_OUTOFMEMORY; 467 } 468 469 pNewWnd->m_lpszUrl = lpszUrl; 470 if(!pdparams) 471 pNewWnd->m_bEmpty = TRUE; 472 473 pNewWnd->m_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); 474 475 if(!pNewWnd->m_hEvent) 476 { 477 } 478 479 InterlockedIncrement(&glThreadCount); 480 481 hThread = CreateThread(NULL, g_dwMainWindowStackSize, NewWindow, (LPVOID)pNewWnd, STACK_SIZE_PARAM_IS_A_RESERVATION, &dwThreadID); 482 if(!hThread) 483 { 484 delete pNewWnd; 485 InterlockedDecrement(&glThreadCount); 486 return E_OUTOFMEMORY; 487 } 488 RETAILMSG(1,(L"[HandleNewWindow2]Create thread,ID is: 0x%x\r\n",dwThreadID)); 489 490 WaitForSingleObject(pNewWnd->m_hEvent, INFINITE); 491 CloseHandle(hThread); 492 if(pdparams) 493 { 494 if(pNewWnd->m_pBrowser) 495 { 496 hr = pNewWnd->m_pBrowser->QueryInterface(IID_IDispatch, (LPVOID *)(&pDispatch)); 497 } 498 else 499 { 500 hr = E_FAIL; 501 pDispatch = NULL; 502 } 503 504 *(pdparams->rgvarg[0].pboolVal) = 0; 505 *(pdparams->rgvarg[1].ppdispVal) = pDispatch; 506 } 507 return hr; 508 } 509 510 511 STDMETHODIMP CMainWnd::GetHostInfo(DOCHOSTUIINFO *pInfo) 512 { 513 514 pInfo->cbSize = sizeof(DOCHOSTUIINFO); 515 //pInfo->dwFlags = DOCHOSTUIFLAG_NO3DBORDER|DOCHOSTUIFLAG_FLAT_SCROLLBAR; 516 //pInfo->dwFlags |= DOCHOSTUIFLAG_SCROLL_NO; 517 518 return S_OK; 519 520 } 521 522 STDMETHODIMP CMainWnd::Invoke ( 523 DISPID dispidMember, 524 REFIID riid, 525 LCID lcid, 526 WORD wFlags, 527 DISPPARAMS FAR* pdparams, 528 VARIANT FAR* pvarResult, 529 EXCEPINFO FAR* pexcepinfo, 530 UINT FAR* puArgErr 531 ) 532 { 533 switch (dispidMember) 534 { 535 case DISPID_AMBIENT_DLCONTROL: 536 if(pvarResult) 537 { 538 V_VT(pvarResult) = VT_I4; 539 // always set these three unless they should be disabled 540 pvarResult->lVal = DLCTL_DLIMAGES|DLCTL_VIDEOS|DLCTL_BGSOUNDS; 541 542 // put the browser in download only mode 543 // pvarResult->lVal |= DLCTL_DOWNLOADONLY; 544 } 545 break; 546 547 case DISPID_STATUSTEXTCHANGE: 548 { 549 } 550 break; 551 552 case DISPID_SETSECURELOCKICON: 553 { 554 } 555 break; 556 557 case DISPID_PROGRESSCHANGE: 558 { 559 LONG lProgMax = pdparams->rgvarg[0].lVal; 560 LONG lProg = pdparams->rgvarg[1].lVal; 561 UINT nPos = (lProg == -1) ? 999 : ((lProg-1)%1000); 562 563 SendMessage(m_hWndProgress, PBM_SETPOS, nPos, 0); 564 } 565 break; 566 567 // notification for file download 568 case DISPID_FILEDOWNLOAD: 569 break; 570 571 572 case DISPID_NAVIGATECOMPLETE2: 573 break; 574 575 case DISPID_COMMANDSTATECHANGE: 576 break; 577 578 case DISPID_TITLECHANGE: 579 if(pdparams && pdparams->rgvarg[0].vt == VT_BSTR) 580 { 581 TCHAR szTitle[85]; 582 int len = wcslen(pdparams->rgvarg[0].bstrVal); 583 584 _tcsncpy(m_tcTitle, pdparams->rgvarg[0].bstrVal, MAX_URL-1); 585 _tcsncpy(szTitle, pdparams->rgvarg[0].bstrVal, 80); 586 if(len > 80) 587 _tcscat(szTitle, L"..."); 588 589 SetWindowText(m_hWndMain, szTitle); 590 } 591 break; 592 593 case DISPID_ONQUIT: 594 PostMessage(m_hWndMain, WM_CLOSE, 0, 0L); 595 break; 596 597 case DISPID_DOWNLOADBEGIN: 598 m_iDLCCounter++; 599 SetWindowPos(m_hWndProgress, HWND_TOP, 0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|SWP_SHOWWINDOW); 600 break; 601 case DISPID_DOWNLOADCOMPLETE: 602 case DISPID_DOCUMENTCOMPLETE: 603 m_iDLCCounter--; 604 if(m_iDLCCounter <= 0) 605 { 606 SetWindowPos(m_hWndProgress,NULL, 0,0,0,0,SWP_NOMOVE|SWP_NOSIZE|SWP_NOACTIVATE|SWP_HIDEWINDOW); 607 ChangeFontSize(TRUE); 608 m_iDLCCounter = 0; 609 } 610 break; 611 612 case DISPID_NEWWINDOW2: 613 //pdparams->rgvarg[1].boolVal = VARIANT_TRUE; 614 //break; 615 return HandleNewWindow2(NULL, pdparams); 616 break; 617 618 619 case DISPID_PROPERTYCHANGE: 620 case DISPID_BEFORENAVIGATE2: 621 break; 622 default: 623 return DISP_E_MEMBERNOTFOUND; 624 } 625 return S_OK; 626 } 627 628 629 STDMETHODIMP CMainWnd::moveTo( LONG x, LONG y) 630 { 631 SetWindowPos(m_hWndMain, NULL, x, y, 0, 0, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE); 632 return S_OK; 633 } 634 635 STDMETHODIMP CMainWnd::moveBy( LONG x, LONG y) 636 { 637 RECT rcWindow; 638 639 GetWindowRect(m_hWndMain, &rcWindow); 640 641 SetWindowPos(m_hWndMain, NULL, rcWindow.left + x, rcWindow.top + y, 0, 0, 642 SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOSIZE); 643 return S_OK; 644 } 645 646 647 STDMETHODIMP CMainWnd::resizeTo( LONG x, LONG y) 648 { 649 // We do not want the size to be less then 100 for top level windows in browser 650 if(x < 100) 651 x = 100; 652 653 if(y < 100) 654 y = 100; 655 656 SetWindowPos(m_hWndMain, NULL, 0, 0, x, y, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE); 657 658 return S_OK; 659 } 660 661 STDMETHODIMP CMainWnd::resizeBy( LONG x, LONG y) 662 { 663 RECT rcWindow; 664 long w, h; 665 666 GetWindowRect(m_hWndMain, &rcWindow); 667 668 w = rcWindow.right - rcWindow.left + x; 669 h = rcWindow.bottom - rcWindow.top + y; 670 671 if(w < 100) 672 w = 100; 673 674 if(h < 100) 675 h = 100; 676 677 SetWindowPos(m_hWndMain, NULL, 0, 0, w, h, SWP_NOACTIVATE | SWP_NOZORDER | SWP_NOMOVE); 678 return S_OK; 679 } 680 681 682 EXTERN_C const GUID CGID_MSHTML; 683 extern "C" BOOL APIENTRY OpenURLDlgProc (HWND hDlg, UINT message, UINT wParam, LONG lParam); 684 685 LRESULT CMainWnd::HandleCommand(WPARAM wParam, LPARAM lParam) 686 { 687 UINT nID = LOWORD(wParam); 688 switch (nID) 689 { 690 case ID_INTERNET_OPTIONS: 691 { 692 SHELLEXECUTEINFO sei; 693 sei.cbSize = sizeof(sei); 694 sei.fMask = SEE_MASK_FLAG_NO_UI; 695 sei.hwnd = m_hWndMain; 696 sei.lpVerb = NULL; 697 sei.lpFile = L"ctlpnl"; 698 sei.lpParameters = L"inetcpl.cpl"; 699 sei.lpDirectory = NULL; 700 sei.nShow = SW_SHOWNORMAL; 701 702 ShellExecuteEx(&sei); 703 } 704 break; 705 case ID_FIND: 706 FindString(); 707 break; 708 case ID_GO_BACK: 709 m_pBrowser->GoBack(); 710 return 0; 711 case ID_GO_FORWARD: 712 m_pBrowser->GoForward(); 713 return 0; 714 case ID_GO_HOME: 715 m_pBrowser->GoHome(); 716 return 0; 717 case ID_GO_SEARCH: 718 m_pBrowser->GoSearch(); 719 return 0; 720 case ID_VIEW_REFRESH: 721 m_pBrowser->Refresh(); 722 return 0; 723 case ID_VIEW_STOP: 724 m_pBrowser->Stop(); 725 return 0; 726 727 case ID_ZOOMUP: 728 m_iZoom++; 729 if(m_iZoom > 4) 730 m_iZoom = 4; 731 ChangeFontSize(FALSE); 732 return 0; 733 734 case ID_ZOOMDOWN: 735 m_iZoom--; 736 if(m_iZoom < 0) 737 m_iZoom = 0; 738 ChangeFontSize(FALSE); 739 return 0; 740 case ID_CLOSE: 741 m_pBrowser->ExecWB(OLECMDID_CLOSE, OLECMDEXECOPT_DODEFAULT, NULL, NULL); 742 return 0; 743 case ID_FOCUS_URL: 744 case ID_OPEN: 745 { 746 WCHAR *szURL = new TCHAR[MAX_URL]; 747 if(szURL) 748 { 749 int nRet = 0; 750 BSTR bstrURL = NULL; 751 m_pBrowser->get_LocationURL(&bstrURL); 752 nRet = StringCchCopy(szURL, MAX_URL, (LPCTSTR)bstrURL); 753 SysFreeString(bstrURL); 754 755 nRet = DialogBoxParam(g_hInstance, MAKEINTRESOURCE(IDD_OPEN_DIALOG), m_hWndMain, OpenURLDlgProc, (long)szURL); 756 bstrURL = SysAllocString(szURL); 757 if(nRet == 1) 758 { 759 m_pBrowser->Navigate(bstrURL, NULL, NULL, NULL, NULL); 760 } 761 else if(nRet == 2) 762 { 763 HandleNewWindow2(bstrURL,NULL); 764 } 765 SysFreeString(bstrURL); 766 delete[] szURL; 767 } 768 } 769 return 0; 770 case ID_FULLSCREEN: 771 { 772 DWORD dwStyle = GetWindowLong(m_hWndMain, GWL_STYLE); 773 if(m_bFullScreen) 774 { 775 dwStyle |= (WS_OVERLAPPED | WS_SYSMENU | WS_THICKFRAME); 776 SetWindowLong(m_hWndMain, GWL_STYLE, dwStyle); 777 SetWindowPos(m_hWndMain,NULL, m_rcWnd.left, m_rcWnd.top, m_rcWnd.right-m_rcWnd.left, m_rcWnd.bottom-m_rcWnd.top, SWP_NOZORDER); 778 m_bFullScreen = FALSE; 779 } 780 else 781 { 782 RECT rcWorkArea; 783 784 SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWorkArea, 0); 785 m_bFullScreen = TRUE; 786 dwStyle &= ~(WS_OVERLAPPED | WS_SYSMENU | WS_THICKFRAME); 787 788 SetWindowLong(m_hWndMain, GWL_STYLE, dwStyle); 789 SetWindowPos(m_hWndMain,NULL, rcWorkArea.left, rcWorkArea.top, rcWorkArea.right-rcWorkArea.left, rcWorkArea.bottom-rcWorkArea.top, SWP_NOZORDER); 790 791 } 792 } 793 return 0; 794 } 795 return 0; 796 } 797 798 799 800 801 802 EXTERN_C const GUID CGID_ShellDocView; 803 804 LRESULT CALLBACK CMainWnd::MainWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) 805 { 806 CMainWnd *pMainWnd = (CMainWnd*)GetWindowLong(hwnd, GWL_USERDATA); 807 808 if(pMainWnd) 809 { 810 switch (message) 811 { 812 case WM_CLOSE: 813 case WM_DESTROY: 814 if(pMainWnd) 815 pMainWnd->Close(); 816 SetWindowLong(hwnd, GWL_USERDATA, (DWORD)0); 817 ::PostQuitMessage(0); 818 break; 819 case WM_SETFOCUS: 820 if(pMainWnd->m_pIPActiveObj) 821 { 822 pMainWnd->m_pIPActiveObj->OnFrameWindowActivate(LOWORD(wParam) != WA_INACTIVE); 823 } 824 return 0; 825 case WM_SIZE: 826 { 827 RECT rcWnd; 828 GetClientRect(hwnd, &rcWnd); 829 SetWindowPos(pMainWnd->m_hWndBrowser, 830 NULL, 831 0, 832 0, 833 rcWnd.right-rcWnd.left, 834 rcWnd.bottom - rcWnd.top, 835 SWP_NOZORDER); 836 } 837 // FALL THROUGH 838 case WM_MOVE: 839 if(!pMainWnd->m_bFullScreen) 840 GetWindowRect(hwnd, &pMainWnd->m_rcWnd); 841 break; 842 case WM_COMMAND: 843 return pMainWnd->HandleCommand(wParam, lParam); 844 break; 845 846 case WM_NOTIFY: 847 break; 848 849 case WM_INITMENUPOPUP: 850 break; 851 852 case WM_SETTINGCHANGE: 853 if(wParam == SPI_SETWORKAREA) 854 { 855 if(pMainWnd->m_bFullScreen) 856 { 857 RECT rcWorkArea; 858 // no need to change the window style here, just adjust for the new work-area. 859 SystemParametersInfo(SPI_GETWORKAREA, 0, &rcWorkArea, 0); 860 SetWindowPos(pMainWnd->m_hWndMain,NULL, rcWorkArea.left, rcWorkArea.top, rcWorkArea.right-rcWorkArea.left, rcWorkArea.bottom-rcWorkArea.top, SWP_NOZORDER); 861 } 862 } 863 break; 864 default: 865 break; 866 } 867 } 868 return DefWindowProc(hwnd, message, wParam, lParam); 869 } 870 871 BOOL CMainWnd::PreTranslateMessage(LPMSG pMsg) 872 { 873 if(::TranslateAccelerator(m_hWndMain, m_hAccelTbl, pMsg)) //first shot to the main frame 874 return TRUE; 875 876 //then to mshtml 877 if(m_pIPActiveObj && pMsg->message >= WM_KEYFIRST && pMsg->message <= WM_KEYLAST) 878 { 879 HRESULT hr = m_pIPActiveObj->TranslateAccelerator(pMsg); 880 return (hr != S_FALSE); 881 } 882 return FALSE; 883 } 884 885 VOID CMainWnd::ChangeFontSize(BOOL fInit) 886 { 887 VARIANT vaSize; 888 vaSize.vt = VT_I4; 889 890 if(fInit) { 891 // Setting initial value 892 vaSize.vt = 0; 893 HRESULT hr = m_pBrowser->ExecWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, 894 NULL, &vaSize); 895 m_iZoom = vaSize.lVal; 896 } else { 897 vaSize.lVal = m_iZoom; 898 HRESULT hr = m_pBrowser->ExecWB(OLECMDID_ZOOM, OLECMDEXECOPT_DONTPROMPTUSER, 899 &vaSize, NULL); 900 } 901 } 902 903 VOID CMainWnd::Close() 904 { 905 RETAILMSG(1,(L"IESIMPLE CMainWnd::Close")); 906 907 // Tell the shell to die off 908 SendMessage(m_hWndBrowser, WM_CLOSE, 0,0); 909 910 911 if(m_pIPActiveObj) 912 { 913 m_pIPActiveObj->Release(); 914 } 915 m_pIPActiveObj = NULL; 916 if(m_pCP) 917 { 918 m_pCP->Unadvise(m_dwEventCookie); 919 m_pCP->Release(); 920 } 921 m_pCP = NULL; 922 if(m_pObject) 923 { 924 m_pObject->Close(FALSE); 925 m_pObject->Release(); 926 } 927 m_pObject = NULL; 928 if(m_pBrowser) 929 m_pBrowser->Release(); 930 m_pBrowser = NULL; 931 932 } 933 934 935 936 937 HRESULT CMainWnd::FindString() 938 { 939 LPDISPATCH pDisp = NULL; 940 LPOLECOMMANDTARGET pCmdTarg = NULL; 941 HRESULT sts = S_OK; 942 VARIANTARG var; 943 944 #define GOERROR_S(bNotCond) {if(!(bNotCond)) goto errorS; } 945 946 if(!m_pBrowser) 947 return S_OK; 948 sts = m_pBrowser->get_Document(&pDisp); 949 GOERROR_S(pDisp); 950 sts = pDisp->QueryInterface(IID_IOleCommandTarget, (LPVOID*)&pCmdTarg); 951 GOERROR_S(pCmdTarg); 952 953 var.vt = VT_I4; 954 var.lVal = 0; 955 sts = pCmdTarg->Exec( 956 NULL, 957 OLECMDID_FIND, 958 MSOCMDEXECOPT_PROMPTUSER, 959 NULL, 960 &var); 961 962 errorS: 963 if(pCmdTarg) 964 pCmdTarg->Release(); // release document's command target 965 if(pDisp) 966 pDisp->Release(); // release document's dispatch interface 967 return sts; 968 } 969 970 971 972 973 BOOL HandleBrowse(HWND hwndOwner, WCHAR *szURL); 974 975 extern "C" BOOL APIENTRY OpenURLDlgProc (HWND hDlg, UINT message, UINT wParam, LONG lParam) 976 { 977 978 WCHAR *szURL = (WCHAR *)GetWindowLong(hDlg,DWL_USER); 979 int nRet = 4; 980 981 switch(message) 982 { 983 984 case WM_INITDIALOG: 985 { 986 if(!lParam) 987 { 988 EnableWindow(GetDlgItem(hDlg, IDOK), FALSE); 989 EnableWindow(GetDlgItem(hDlg, IDC_BROWSE), FALSE); 990 } 991 else 992 { 993 szURL = (WCHAR *)lParam; 994 SetWindowLong(hDlg, DWL_USER, (LONG)szURL); 995 SendMessage(GetDlgItem(hDlg, IDC_URL_EDIT), EM_LIMITTEXT, MAX_URL-1, 0); 996 if(szURL[0]) 997 { 998 999 SetDlgItemText(hDlg, IDC_URL_EDIT, szURL); 1000 } 1001 } 1002 1003 } 1004 return TRUE; 1005 1006 case WM_COMMAND: 1007 switch (LOWORD(wParam)) 1008 { 1009 1010 case IDOK: 1011 { 1012 GetDlgItemText(hDlg, IDC_URL_EDIT, szURL, MAX_URL-1); 1013 BOOL bNewWnd = SendMessage(GetDlgItem(hDlg, IDC_NEWWINDOW), BM_GETCHECK, 0L, 0L); 1014 nRet = (bNewWnd) ? 2 : 1; 1015 } 1016 case IDCANCEL: 1017 EndDialog(hDlg, nRet); 1018 return TRUE; 1019 1020 1021 case IDC_BROWSE: 1022 if(HandleBrowse(hDlg, szURL)) 1023 { 1024 SetDlgItemText(hDlg, IDC_URL_EDIT, szURL); 1025 } 1026 1027 default: 1028 return (TRUE); 1029 } 1030 break; 1031 1032 case WM_DESTROY: 1033 SetWindowLong(hDlg, DWL_USER, 0); 1034 break; 1035 1036 } 1037 return (FALSE); 1038 1039 1040 } 1041 1042 1043 extern HINSTANCE g_hInstance; 1044 BOOL HandleBrowse(HWND hwndOwner, WCHAR *szURL) 1045 { 1046 1047 OPENFILENAME ofn; 1048 WCHAR wchFilter[MAX_PATH]; 1049 WCHAR wchFile[MAX_PATH+8]; 1050 int cbLen; 1051 1052 1053 // Initialize ofn struct 1054 memset(&ofn, 0, sizeof(ofn)); 1055 ofn.lStructSize = sizeof(ofn); 1056 ofn.hwndOwner = hwndOwner; 1057 ofn.Flags = OFN_FILEMUSTEXIST | 1058 OFN_PATHMUSTEXIST | 1059 OFN_OVERWRITEPROMPT | 1060 OFN_HIDEREADONLY; 1061 1062 cbLen = LoadString(g_hInstance, IDS_BROWSEFILTER, 1063 wchFilter, MAX_PATH-2); 1064 1065 if(cbLen>0) 1066 { 1067 for (; cbLen >= 0; cbLen--) 1068 { 1069 if(wchFilter[cbLen]== L'@') 1070 { 1071 wchFilter[cbLen] = 0; 1072 } 1073 } 1074 } 1075 else 1076 { 1077 return FALSE; 1078 } 1079 1080 1081 ofn.lpstrFilter = wchFilter; 1082 ofn.nFilterIndex = 1; 1083 wcscpy(wchFile, L"file://"); 1084 1085 ofn.lpstrFile = wchFile+wcslen(wchFile); // prefix the string with "file://" 1086 ofn.nMaxFile = MAX_PATH; 1087 if(GetOpenFileName(&ofn)) 1088 { 1089 wcsncpy(szURL, wchFile, MAX_URL-1); 1090 return TRUE; 1091 } 1092 1093 return FALSE; 1094 1095 }