4 * Copyright 2009 Andrew Hill <ash77 at domain reactos.org>
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
27 #define USE_CUSTOM_EXPLORERBAND 1
29 extern HRESULT
IUnknown_ShowDW(IUnknown
* punk
, BOOL fShow
);
31 #include "newatlinterfaces.h"
35 **Provide implementation of new and delete that use LocalAlloc
36 **Persist history for shell view isn't working correctly, possibly because of the mismatch between traveling and updating the travel log. The
37 view doesn't restore the selection correctly.
38 **Build explorer.exe, browseui.dll, comctl32.dll, shdocvw.dll, shell32.dll, shlwapi.dll into a directory and run them for testing...
39 **Add brand band bitmaps to shell32.dll
40 **If Go button on address bar is clicked, each time a new duplicate entry is added to travel log
41 ****The current entry is updated in travel log before doing the travel, which means when traveling back the update of the
42 current state overwrites the wrong entry's contents. This needs to be changed.
43 ****Fix close of browser window to release all objects
44 ****Given only a GUID in ShowBrowserBar, what is the correct way to determine if the bar is vertical or horizontal?
45 **When a new bar is added to base bar site, how is base bar told so it can resize?
46 **Does the base bar site have a classid?
47 **What should refresh command send to views to make them refresh?
48 **When new bar is created, what status notifications need to be fired?
49 **How does keyboard filtering dispatch?
50 **For deferred persist history load, how does the view connect up and get the state?
51 How does context menu send open, cut, rename commands to its site (the shell view)?
52 **Fix browser to implement IProfferService and hold onto brand band correctly - this will allow animations.
54 **Route View->Toolbars commands to internet toolbar
55 **Handle travel log items in View->Go
56 **Fix ShowBrowserBar to pass correct size on when bar is shown
57 ****Fix SetBorderSpaceDW to cascade resize to subsequent bars
58 ****Make ShowToolbar check if bar is already created before creating it again
59 ****Shell should fill in the list of explorer bars in the View submenus
60 **Add folder menu in the file menu
61 **Fix CShellBrowser::GetBorderDW to compute available size correctly
62 **When a new bar is shown, re-fire the navigate event. This makes the explorer band select the correct folder
63 **Implement support for refresh. Forward refresh to explorer bar (refresh on toolbar and in menu is dispatched different)
64 Make folders toolbar item update state appropriately
65 Read list of bands from registry on launch
66 Read list of bars from registry on launch
67 If the folders or search bars don't exist, disable the toolbar buttons
68 If the favorites or history bars don't exist, disable the toolbar butons
69 Fix Apply to all Folders in Folder Options
70 Implement close command
71 Add explorer band context menu to file menu
72 Add code to allow restore of internet toolbar from registry
73 Fix code that calls FireNavigateComplete to pass the correct new path
75 What are the other command ids for QueryStatus/FireCommandStateChange?
77 Add handler for cabinet settings change
78 Add handler for system metrics change (renegotiate border space?)
79 Add handler for theme change and forward to contained windows
81 When folders are shown, the status bar text should change
82 Add code to save/restore shell view settings
83 Implement tabbing between frames
84 Fix handling of focus everywhere
85 Most keyboard shortcuts don't work, such as F2 for rename, F5 for refresh (see list in "explorer keyboard shortcuts")
87 The status bar doesn't show help text for items owned by frame during menu tracking
88 Stub out frame command handlers
89 "Arrange icons by" group is not checked properly
91 When folders are hidden, icon is the same as the current shell object being displayed. When folders are shown,
92 the icon is always an open folder with magnifying glass
93 Fix bars to calculate height correctly
94 Hookup policies for everything...
95 Investigate toolbar message WM_USER+93
96 Investigate toolbar message WM_USER+100 (Adds extra padding between parts of buttons with BTNS_DROPDOWN | BTNS_SHOWTEXT style
98 Vertical Explorer Bar CATID_InfoBand
99 Horizontal Explorer Bar CATID_CommBand
100 Desk Band CATID_DeskBand
103 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021493-0000-0000-C000-000000000046}\Enum
104 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Discardable\PostSetup\Component Categories\{00021494-0000-0000-C000-000000000046}\Enum
106 create key here with CLSID of bar to register tool band
107 HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar
112 #pragma comment(linker, \
113 "\"/manifestdependency:type='Win32' "\
114 "name='Microsoft.Windows.Common-Controls' "\
115 "version='6.0.0.0' "\
116 "processorArchitecture='*' "\
117 "publicKeyToken='6595b64144ccf1df' "\
121 struct categoryCacheHeader
123 long dwSize
; // size of header only
124 long version
; // currently 1
125 SYSTEMTIME writeTime
; // time we were written to registry
126 long classCount
; // number of classes following
129 static const unsigned int folderOptionsPageCountMax
= 20;
130 static const long BTP_DONT_UPDATE_HISTORY
= 0;
131 static const long BTP_UPDATE_CUR_HISTORY
= 1;
132 static const long BTP_UPDATE_NEXT_HISTORY
= 2;
134 BOOL createNewStuff
= false;
137 // this class is private to browseui.dll and is not registered externally?
138 //DEFINE_GUID(CLSID_ShellFldSetExt, 0x6D5313C0, 0x8C62, 0x11D1, 0xB2, 0xCD, 0x00, 0x60, 0x97, 0xDF, 0x8C, 0x11);
141 extern HRESULT
CreateTravelLog(REFIID riid
, void **ppv
);
142 extern HRESULT
CreateBaseBar(REFIID riid
, void **ppv
);
143 extern HRESULT
CreateBaseBarSite(REFIID riid
, void **ppv
);
146 extern HRESULT
CreateInternetToolbar(REFIID riid
, void **ppv
);
148 void DeleteMenuItems(HMENU theMenu
, unsigned int firstIDToDelete
, unsigned int lastIDToDelete
)
150 MENUITEMINFO menuItemInfo
;
154 menuItemCount
= GetMenuItemCount(theMenu
);
156 while (curIndex
< menuItemCount
)
158 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
159 menuItemInfo
.fMask
= MIIM_ID
;
160 if (GetMenuItemInfo(theMenu
, curIndex
, TRUE
, &menuItemInfo
) &&
161 menuItemInfo
.wID
>= firstIDToDelete
&& menuItemInfo
.wID
<= lastIDToDelete
)
163 DeleteMenu(theMenu
, curIndex
, MF_BYPOSITION
);
171 HRESULT WINAPI
SHBindToFolder(LPCITEMIDLIST path
, IShellFolder
**newFolder
)
173 CComPtr
<IShellFolder
> desktop
;
175 HRESULT hr
= ::SHGetDesktopFolder(&desktop
);
176 if (FAILED_UNEXPECTEDLY(hr
))
178 if (path
== NULL
|| path
->mkid
.cb
== 0)
180 *newFolder
= desktop
;
181 desktop
.p
->AddRef ();
184 return desktop
->BindToObject (path
, NULL
, IID_PPV_ARG(IShellFolder
, newFolder
));
187 static const TCHAR szCabinetWndClass
[] = TEXT("CabinetWClassX");
188 static const TCHAR szExploreWndClass
[] = TEXT("ExploreWClassX");
193 class CToolbarProxy
:
194 public CWindowImpl
<CToolbarProxy
, CWindow
, CControlWinTraits
>
197 CComPtr
<IExplorerToolbar
> fExplorerToolbar
;
199 void Initialize(HWND parent
, IUnknown
*explorerToolbar
);
204 LRESULT
OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
205 LRESULT
OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
207 BEGIN_MSG_MAP(CToolbarProxy
)
208 MESSAGE_HANDLER(TB_ADDBITMAP
, OnAddBitmap
)
209 MESSAGE_RANGE_HANDLER(WM_USER
, 0x7fff, OnForwardMessage
)
213 void CToolbarProxy::Initialize(HWND parent
, IUnknown
*explorerToolbar
)
218 myWindow
= SHCreateWorkerWindowW(0, parent
, 0, WS_CHILD
, NULL
, 0);
219 if (myWindow
!= NULL
)
221 SubclassWindow(myWindow
);
222 SetWindowPos(NULL
, -32000, -32000, 0, 0, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
223 hResult
= explorerToolbar
->QueryInterface(
224 IID_PPV_ARG(IExplorerToolbar
, &fExplorerToolbar
));
228 LRESULT
CToolbarProxy::OnAddBitmap(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
234 if (fExplorerToolbar
.p
!= NULL
)
236 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 1, (long)wParam
,
237 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
238 hResult
= fExplorerToolbar
->AddBitmap(&CGID_ShellBrowser
, 2, (long)wParam
,
239 reinterpret_cast<TBADDBITMAP
*>(lParam
), &result
, RGB(192, 192, 192));
244 LRESULT
CToolbarProxy::OnForwardMessage(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
250 if (fExplorerToolbar
.p
!= NULL
)
251 hResult
= fExplorerToolbar
->SendToolbarMsg(&CGID_ShellBrowser
, uMsg
, wParam
, lParam
, &result
);
256 Switch to a new bar when it receives an Exec(CGID_IDeskBand, 1, 1, vaIn, NULL);
257 where vaIn will be a VT_UNKNOWN with the new bar. It also sends a RB_SHOWBAND to the
261 class CShellBrowser
:
262 public CWindowImpl
<CShellBrowser
, CWindow
, CFrameWinTraits
>,
263 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
264 public IShellBrowser
,
266 public IServiceProvider
,
267 public IProfferServiceImpl
<CShellBrowser
>,
268 public IShellBrowserService
,
270 public ITravelLogClient
,
271 public IPersistHistory
,
272 public IDockingWindowSite
,
273 public IOleCommandTarget
,
274 public IBrowserService2
,
275 public IConnectionPointContainerImpl
<CShellBrowser
>,
276 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>,
277 public MyIConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>
284 CComPtr
<IUnknown
> clientBar
;
287 static const int BIInternetToolbar
= 0;
288 static const int BIVerticalBaseBar
= 1;
289 static const int BIHorizontalBaseBar
= 2;
291 HWND fCurrentShellViewWindow
; // our currently hosted shell view window
292 CComPtr
<IShellFolder
> fCurrentShellFolder
; //
293 CComPtr
<IShellView
> fCurrentShellView
; //
294 LPITEMIDLIST fCurrentDirectoryPIDL
; //
296 bool fStatusBarVisible
;
297 CToolbarProxy fToolbarProxy
;
298 barInfo fClientBars
[3];
299 CComPtr
<ITravelLog
> fTravelLog
;
300 HMENU fCurrentMenuBar
;
301 CABINETSTATE fCabinetState
;
302 // The next three fields support persisted history for shell views.
303 // They do not need to be reference counted.
304 IOleObject
*fHistoryObject
;
305 IStream
*fHistoryStream
;
306 IBindCtx
*fHistoryBindContext
;
310 ULONG
InternalAddRef()
312 OutputDebugString(_T("AddRef\n"));
313 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalAddRef();
315 ULONG
InternalRelease()
317 OutputDebugString(_T("Release\n"));
318 return CComObjectRootEx
<CComMultiThreadModelNoCS
>::InternalRelease();
324 HRESULT
Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
);
326 HRESULT
BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
);
327 HRESULT
BrowseToPath(IShellFolder
*newShellFolder
, LPCITEMIDLIST absolutePIDL
,
328 FOLDERSETTINGS
*folderSettings
, long flags
);
329 HRESULT
GetMenuBand(REFIID riid
, void **shellMenu
);
330 HRESULT
GetBaseBar(bool vertical
, IUnknown
**theBaseBar
);
331 HRESULT
ShowBand(const CLSID
&classID
, bool vertical
);
332 HRESULT
NavigateToParent();
333 HRESULT
DoFolderOptions();
334 static LRESULT CALLBACK
WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
335 void RepositionBars();
336 virtual WNDPROC
GetWindowProc()
340 HRESULT
FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
);
341 HRESULT
FireNavigateComplete(const wchar_t *newDirectory
);
342 HRESULT
FireCommandStateChange(bool newState
, int commandID
);
343 HRESULT
FireCommandStateChangeAll();
344 HRESULT
UpdateForwardBackState();
345 HRESULT
UpdateUpState();
346 void UpdateGotoMenu(HMENU theMenu
);
347 void UpdateViewMenu(HMENU theMenu
);
349 /* // *** IDockingWindowFrame methods ***
350 virtual HRESULT STDMETHODCALLTYPE AddToolbar(IUnknown *punkSrc, LPCWSTR pwszItem, DWORD dwAddFlags);
351 virtual HRESULT STDMETHODCALLTYPE RemoveToolbar(IUnknown *punkSrc, DWORD dwRemoveFlags);
352 virtual HRESULT STDMETHODCALLTYPE FindToolbar(LPCWSTR pwszItem, REFIID riid, void **ppv);
355 // *** IDockingWindowSite methods ***
356 virtual HRESULT STDMETHODCALLTYPE
GetBorderDW(IUnknown
* punkObj
, LPRECT prcBorder
);
357 virtual HRESULT STDMETHODCALLTYPE
RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
358 virtual HRESULT STDMETHODCALLTYPE
SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
);
360 // *** IOleCommandTarget methods ***
361 virtual HRESULT STDMETHODCALLTYPE
QueryStatus(const GUID
*pguidCmdGroup
, ULONG cCmds
,
362 OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
);
363 virtual HRESULT STDMETHODCALLTYPE
Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
364 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
);
366 // *** IOleWindow methods ***
367 virtual HRESULT STDMETHODCALLTYPE
GetWindow(HWND
*lphwnd
);
368 virtual HRESULT STDMETHODCALLTYPE
ContextSensitiveHelp(BOOL fEnterMode
);
370 // *** IShellBrowser methods ***
371 virtual HRESULT STDMETHODCALLTYPE
InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
);
372 virtual HRESULT STDMETHODCALLTYPE
SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
);
373 virtual HRESULT STDMETHODCALLTYPE
RemoveMenusSB(HMENU hmenuShared
);
374 virtual HRESULT STDMETHODCALLTYPE
SetStatusTextSB(LPCOLESTR pszStatusText
);
375 virtual HRESULT STDMETHODCALLTYPE
EnableModelessSB(BOOL fEnable
);
376 virtual HRESULT STDMETHODCALLTYPE
TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
);
377 virtual HRESULT STDMETHODCALLTYPE
BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
);
378 virtual HRESULT STDMETHODCALLTYPE
GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
);
379 virtual HRESULT STDMETHODCALLTYPE
GetControlWindow(UINT id
, HWND
*lphwnd
);
380 virtual HRESULT STDMETHODCALLTYPE
SendControlMsg(UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
);
381 virtual HRESULT STDMETHODCALLTYPE
QueryActiveShellView(IShellView
**ppshv
);
382 virtual HRESULT STDMETHODCALLTYPE
OnViewWindowActive(IShellView
*ppshv
);
383 virtual HRESULT STDMETHODCALLTYPE
SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
);
385 // *** IDropTarget methods ***
386 virtual HRESULT STDMETHODCALLTYPE
DragEnter(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
387 virtual HRESULT STDMETHODCALLTYPE
DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
388 virtual HRESULT STDMETHODCALLTYPE
DragLeave();
389 virtual HRESULT STDMETHODCALLTYPE
Drop(IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
);
391 // *** IServiceProvider methods ***
392 virtual HRESULT STDMETHODCALLTYPE
QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
);
394 // *** IShellBowserService methods ***
395 virtual HRESULT STDMETHODCALLTYPE
GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
);
397 // *** IDispatch methods ***
398 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfoCount(UINT
*pctinfo
);
399 virtual HRESULT STDMETHODCALLTYPE
GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
);
400 virtual HRESULT STDMETHODCALLTYPE
GetIDsOfNames(
401 REFIID riid
, LPOLESTR
*rgszNames
, UINT cNames
, LCID lcid
, DISPID
*rgDispId
);
402 virtual HRESULT STDMETHODCALLTYPE
Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
, WORD wFlags
,
403 DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
);
405 // *** IBrowserService methods ***
406 virtual HRESULT STDMETHODCALLTYPE
GetParentSite(IOleInPlaceSite
**ppipsite
);
407 virtual HRESULT STDMETHODCALLTYPE
SetTitle(IShellView
*psv
, LPCWSTR pszName
);
408 virtual HRESULT STDMETHODCALLTYPE
GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
);
409 virtual HRESULT STDMETHODCALLTYPE
GetOleObject(IOleObject
**ppobjv
);
410 virtual HRESULT STDMETHODCALLTYPE
GetTravelLog(ITravelLog
**pptl
);
411 virtual HRESULT STDMETHODCALLTYPE
ShowControlWindow(UINT id
, BOOL fShow
);
412 virtual HRESULT STDMETHODCALLTYPE
IsControlWindowShown(UINT id
, BOOL
*pfShown
);
413 virtual HRESULT STDMETHODCALLTYPE
IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
);
414 virtual HRESULT STDMETHODCALLTYPE
IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
);
415 virtual HRESULT STDMETHODCALLTYPE
DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
);
416 virtual HRESULT STDMETHODCALLTYPE
NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
);
417 virtual HRESULT STDMETHODCALLTYPE
SetNavigateState(BNSTATE bnstate
);
418 virtual HRESULT STDMETHODCALLTYPE
GetNavigateState(BNSTATE
*pbnstate
);
419 virtual HRESULT STDMETHODCALLTYPE
NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
);
420 virtual HRESULT STDMETHODCALLTYPE
UpdateWindowList();
421 virtual HRESULT STDMETHODCALLTYPE
UpdateBackForwardState();
422 virtual HRESULT STDMETHODCALLTYPE
SetFlags(DWORD dwFlags
, DWORD dwFlagMask
);
423 virtual HRESULT STDMETHODCALLTYPE
GetFlags(DWORD
*pdwFlags
);
424 virtual HRESULT STDMETHODCALLTYPE
CanNavigateNow( void);
425 virtual HRESULT STDMETHODCALLTYPE
GetPidl(LPITEMIDLIST
*ppidl
);
426 virtual HRESULT STDMETHODCALLTYPE
SetReferrer(LPCITEMIDLIST pidl
);
427 virtual DWORD STDMETHODCALLTYPE
GetBrowserIndex();
428 virtual HRESULT STDMETHODCALLTYPE
GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
);
429 virtual HRESULT STDMETHODCALLTYPE
GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
);
430 virtual HRESULT STDMETHODCALLTYPE
SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
);
431 virtual HRESULT STDMETHODCALLTYPE
CacheOLEServer(IOleObject
*pole
);
432 virtual HRESULT STDMETHODCALLTYPE
GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
);
433 virtual HRESULT STDMETHODCALLTYPE
OnHttpEquiv(IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
);
434 virtual HRESULT STDMETHODCALLTYPE
GetPalette(HPALETTE
*hpal
);
435 virtual HRESULT STDMETHODCALLTYPE
RegisterWindow(BOOL fForceRegister
, int swc
);
437 // *** IBrowserService2 methods ***
438 virtual LRESULT STDMETHODCALLTYPE
WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
439 virtual HRESULT STDMETHODCALLTYPE
SetAsDefFolderSettings();
440 virtual HRESULT STDMETHODCALLTYPE
GetViewRect(RECT
*prc
);
441 virtual HRESULT STDMETHODCALLTYPE
OnSize(WPARAM wParam
);
442 virtual HRESULT STDMETHODCALLTYPE
OnCreate(struct tagCREATESTRUCTW
*pcs
);
443 virtual LRESULT STDMETHODCALLTYPE
OnCommand(WPARAM wParam
, LPARAM lParam
);
444 virtual HRESULT STDMETHODCALLTYPE
OnDestroy();
445 virtual LRESULT STDMETHODCALLTYPE
OnNotify(struct tagNMHDR
*pnm
);
446 virtual HRESULT STDMETHODCALLTYPE
OnSetFocus();
447 virtual HRESULT STDMETHODCALLTYPE
OnFrameWindowActivateBS(BOOL fActive
);
448 virtual HRESULT STDMETHODCALLTYPE
ReleaseShellView();
449 virtual HRESULT STDMETHODCALLTYPE
ActivatePendingView();
450 virtual HRESULT STDMETHODCALLTYPE
CreateViewWindow(IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
);
451 virtual HRESULT STDMETHODCALLTYPE
CreateBrowserPropSheetExt(REFIID riid
, void **ppv
);
452 virtual HRESULT STDMETHODCALLTYPE
GetViewWindow(HWND
*phwndView
);
453 virtual HRESULT STDMETHODCALLTYPE
GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
);
454 virtual LPBASEBROWSERDATA STDMETHODCALLTYPE
PutBaseBrowserData( void);
455 virtual HRESULT STDMETHODCALLTYPE
InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
);
456 virtual HRESULT STDMETHODCALLTYPE
SetTopBrowser();
457 virtual HRESULT STDMETHODCALLTYPE
Offline(int iCmd
);
458 virtual HRESULT STDMETHODCALLTYPE
AllowViewResize(BOOL f
);
459 virtual HRESULT STDMETHODCALLTYPE
SetActivateState(UINT u
);
460 virtual HRESULT STDMETHODCALLTYPE
UpdateSecureLockIcon(int eSecureLock
);
461 virtual HRESULT STDMETHODCALLTYPE
InitializeDownloadManager();
462 virtual HRESULT STDMETHODCALLTYPE
InitializeTransitionSite();
463 virtual HRESULT STDMETHODCALLTYPE
_Initialize(HWND hwnd
, IUnknown
*pauto
);
464 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingNavigationAsync( void);
465 virtual HRESULT STDMETHODCALLTYPE
_CancelPendingView();
466 virtual HRESULT STDMETHODCALLTYPE
_MaySaveChanges();
467 virtual HRESULT STDMETHODCALLTYPE
_PauseOrResumeView(BOOL fPaused
);
468 virtual HRESULT STDMETHODCALLTYPE
_DisableModeless();
469 virtual HRESULT STDMETHODCALLTYPE
_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
);
470 virtual HRESULT STDMETHODCALLTYPE
_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
);
471 virtual HRESULT STDMETHODCALLTYPE
_SwitchActivationNow();
472 virtual HRESULT STDMETHODCALLTYPE
_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
, const GUID
*pguidCmdGroup
,
473 DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
);
474 virtual HRESULT STDMETHODCALLTYPE
_SendChildren(
475 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
476 virtual HRESULT STDMETHODCALLTYPE
GetFolderSetData(struct tagFolderSetData
*pfsd
);
477 virtual HRESULT STDMETHODCALLTYPE
_OnFocusChange(UINT itb
);
478 virtual HRESULT STDMETHODCALLTYPE
v_ShowHideChildWindows(BOOL fChildOnly
);
479 virtual UINT STDMETHODCALLTYPE
_get_itbLastFocus();
480 virtual HRESULT STDMETHODCALLTYPE
_put_itbLastFocus(UINT itbLastFocus
);
481 virtual HRESULT STDMETHODCALLTYPE
_UIActivateView(UINT uState
);
482 virtual HRESULT STDMETHODCALLTYPE
_GetViewBorderRect(RECT
*prc
);
483 virtual HRESULT STDMETHODCALLTYPE
_UpdateViewRectSize();
484 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorder(UINT itb
);
485 virtual HRESULT STDMETHODCALLTYPE
_ResizeView();
486 virtual HRESULT STDMETHODCALLTYPE
_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
);
487 virtual IStream
*STDMETHODCALLTYPE
v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
);
488 virtual LRESULT STDMETHODCALLTYPE
ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
);
489 virtual HRESULT STDMETHODCALLTYPE
SetAcceleratorMenu(HACCEL hacc
);
490 virtual int STDMETHODCALLTYPE
_GetToolbarCount();
491 virtual LPTOOLBARITEM STDMETHODCALLTYPE
_GetToolbarItem(int itb
);
492 virtual HRESULT STDMETHODCALLTYPE
_SaveToolbars(IStream
*pstm
);
493 virtual HRESULT STDMETHODCALLTYPE
_LoadToolbars(IStream
*pstm
);
494 virtual HRESULT STDMETHODCALLTYPE
_CloseAndReleaseToolbars(BOOL fClose
);
495 virtual HRESULT STDMETHODCALLTYPE
v_MayGetNextToolbarFocus(LPMSG lpMsg
, UINT itbNext
,
496 int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
);
497 virtual HRESULT STDMETHODCALLTYPE
_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
);
498 virtual UINT STDMETHODCALLTYPE
_FindTBar(IUnknown
*punkSrc
);
499 virtual HRESULT STDMETHODCALLTYPE
_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
);
500 virtual HRESULT STDMETHODCALLTYPE
v_MayTranslateAccelerator(MSG
*pmsg
);
501 virtual HRESULT STDMETHODCALLTYPE
_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
);
502 virtual HRESULT STDMETHODCALLTYPE
v_CheckZoneCrossing(LPCITEMIDLIST pidl
);
504 // *** IWebBrowser methods ***
505 virtual HRESULT STDMETHODCALLTYPE
GoBack();
506 virtual HRESULT STDMETHODCALLTYPE
GoForward();
507 virtual HRESULT STDMETHODCALLTYPE
GoHome();
508 virtual HRESULT STDMETHODCALLTYPE
GoSearch();
509 virtual HRESULT STDMETHODCALLTYPE
Navigate(BSTR URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
510 VARIANT
*PostData
, VARIANT
*Headers
);
511 virtual HRESULT STDMETHODCALLTYPE
Refresh();
512 virtual HRESULT STDMETHODCALLTYPE
Refresh2(VARIANT
*Level
);
513 virtual HRESULT STDMETHODCALLTYPE
Stop();
514 virtual HRESULT STDMETHODCALLTYPE
get_Application(IDispatch
**ppDisp
);
515 virtual HRESULT STDMETHODCALLTYPE
get_Parent(IDispatch
**ppDisp
);
516 virtual HRESULT STDMETHODCALLTYPE
get_Container(IDispatch
**ppDisp
);
517 virtual HRESULT STDMETHODCALLTYPE
get_Document(IDispatch
**ppDisp
);
518 virtual HRESULT STDMETHODCALLTYPE
get_TopLevelContainer(VARIANT_BOOL
*pBool
);
519 virtual HRESULT STDMETHODCALLTYPE
get_Type(BSTR
*Type
);
520 virtual HRESULT STDMETHODCALLTYPE
get_Left(long *pl
);
521 virtual HRESULT STDMETHODCALLTYPE
put_Left(long Left
);
522 virtual HRESULT STDMETHODCALLTYPE
get_Top(long *pl
);
523 virtual HRESULT STDMETHODCALLTYPE
put_Top(long Top
);
524 virtual HRESULT STDMETHODCALLTYPE
get_Width(long *pl
);
525 virtual HRESULT STDMETHODCALLTYPE
put_Width(long Width
);
526 virtual HRESULT STDMETHODCALLTYPE
get_Height(long *pl
);
527 virtual HRESULT STDMETHODCALLTYPE
put_Height(long Height
);
528 virtual HRESULT STDMETHODCALLTYPE
get_LocationName(BSTR
*LocationName
);
529 virtual HRESULT STDMETHODCALLTYPE
get_LocationURL(BSTR
*LocationURL
);
530 virtual HRESULT STDMETHODCALLTYPE
get_Busy(VARIANT_BOOL
*pBool
);
532 // *** IWebBrowserApp methods ***
533 virtual HRESULT STDMETHODCALLTYPE
Quit();
534 virtual HRESULT STDMETHODCALLTYPE
ClientToWindow(int *pcx
, int *pcy
);
535 virtual HRESULT STDMETHODCALLTYPE
PutProperty(BSTR Property
, VARIANT vtValue
);
536 virtual HRESULT STDMETHODCALLTYPE
GetProperty(BSTR Property
, VARIANT
*pvtValue
);
537 virtual HRESULT STDMETHODCALLTYPE
get_Name(BSTR
*Name
);
538 virtual HRESULT STDMETHODCALLTYPE
get_HWND(SHANDLE_PTR
*pHWND
);
539 virtual HRESULT STDMETHODCALLTYPE
get_FullName(BSTR
*FullName
);
540 virtual HRESULT STDMETHODCALLTYPE
get_Path(BSTR
*Path
);
541 virtual HRESULT STDMETHODCALLTYPE
get_Visible(VARIANT_BOOL
*pBool
);
542 virtual HRESULT STDMETHODCALLTYPE
put_Visible(VARIANT_BOOL Value
);
543 virtual HRESULT STDMETHODCALLTYPE
get_StatusBar(VARIANT_BOOL
*pBool
);
544 virtual HRESULT STDMETHODCALLTYPE
put_StatusBar(VARIANT_BOOL Value
);
545 virtual HRESULT STDMETHODCALLTYPE
get_StatusText(BSTR
*StatusText
);
546 virtual HRESULT STDMETHODCALLTYPE
put_StatusText(BSTR StatusText
);
547 virtual HRESULT STDMETHODCALLTYPE
get_ToolBar(int *Value
);
548 virtual HRESULT STDMETHODCALLTYPE
put_ToolBar(int Value
);
549 virtual HRESULT STDMETHODCALLTYPE
get_MenuBar(VARIANT_BOOL
*Value
);
550 virtual HRESULT STDMETHODCALLTYPE
put_MenuBar(VARIANT_BOOL Value
);
551 virtual HRESULT STDMETHODCALLTYPE
get_FullScreen(VARIANT_BOOL
*pbFullScreen
);
552 virtual HRESULT STDMETHODCALLTYPE
put_FullScreen(VARIANT_BOOL bFullScreen
);
554 // *** IWebBrowser2 methods ***
555 virtual HRESULT STDMETHODCALLTYPE
Navigate2(VARIANT
*URL
, VARIANT
*Flags
, VARIANT
*TargetFrameName
,
556 VARIANT
*PostData
, VARIANT
*Headers
);
557 virtual HRESULT STDMETHODCALLTYPE
QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
);
558 virtual HRESULT STDMETHODCALLTYPE
ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
559 VARIANT
*pvaIn
, VARIANT
*pvaOut
);
560 virtual HRESULT STDMETHODCALLTYPE
ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
);
561 virtual HRESULT STDMETHODCALLTYPE
get_ReadyState(READYSTATE
*plReadyState
);
562 virtual HRESULT STDMETHODCALLTYPE
get_Offline(VARIANT_BOOL
*pbOffline
);
563 virtual HRESULT STDMETHODCALLTYPE
put_Offline(VARIANT_BOOL bOffline
);
564 virtual HRESULT STDMETHODCALLTYPE
get_Silent(VARIANT_BOOL
*pbSilent
);
565 virtual HRESULT STDMETHODCALLTYPE
put_Silent(VARIANT_BOOL bSilent
);
566 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
);
567 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsBrowser(VARIANT_BOOL bRegister
);
568 virtual HRESULT STDMETHODCALLTYPE
get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
);
569 virtual HRESULT STDMETHODCALLTYPE
put_RegisterAsDropTarget(VARIANT_BOOL bRegister
);
570 virtual HRESULT STDMETHODCALLTYPE
get_TheaterMode(VARIANT_BOOL
*pbRegister
);
571 virtual HRESULT STDMETHODCALLTYPE
put_TheaterMode(VARIANT_BOOL bRegister
);
572 virtual HRESULT STDMETHODCALLTYPE
get_AddressBar(VARIANT_BOOL
*Value
);
573 virtual HRESULT STDMETHODCALLTYPE
put_AddressBar(VARIANT_BOOL Value
);
574 virtual HRESULT STDMETHODCALLTYPE
get_Resizable(VARIANT_BOOL
*Value
);
575 virtual HRESULT STDMETHODCALLTYPE
put_Resizable(VARIANT_BOOL Value
);
577 // *** ITravelLogClient methods ***
578 virtual HRESULT STDMETHODCALLTYPE
FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
);
579 virtual HRESULT STDMETHODCALLTYPE
GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
);
580 virtual HRESULT STDMETHODCALLTYPE
LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
);
582 // *** IPersist methods ***
583 virtual HRESULT STDMETHODCALLTYPE
GetClassID(CLSID
*pClassID
);
585 // *** IPersistHistory methods ***
586 virtual HRESULT STDMETHODCALLTYPE
LoadHistory(IStream
*pStream
, IBindCtx
*pbc
);
587 virtual HRESULT STDMETHODCALLTYPE
SaveHistory(IStream
*pStream
);
588 virtual HRESULT STDMETHODCALLTYPE
SetPositionCookie(DWORD dwPositioncookie
);
589 virtual HRESULT STDMETHODCALLTYPE
GetPositionCookie(DWORD
*pdwPositioncookie
);
592 LRESULT
OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
593 LRESULT
OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
594 LRESULT
OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
595 LRESULT
OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
596 LRESULT
OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
597 LRESULT
RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
598 LRESULT
OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
599 LRESULT
OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
600 LRESULT
OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
601 LRESULT
OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
602 LRESULT
OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
603 LRESULT
OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
604 LRESULT
OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
605 LRESULT
OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
606 LRESULT
OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
607 LRESULT
OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
608 LRESULT
OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
609 LRESULT
OnOrganizeFavorites(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
610 LRESULT
OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
611 LRESULT
OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
612 LRESULT
OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
613 LRESULT
OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
614 LRESULT
OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
615 LRESULT
OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
616 LRESULT
OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
617 LRESULT
OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
);
618 LRESULT
RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
);
620 static ATL::CWndClassInfo
& GetWndClassInfo()
622 static ATL::CWndClassInfo wc
=
624 { sizeof(WNDCLASSEX
), CS_DBLCLKS
, StartWindowProc
,
625 0, 0, NULL
, LoadIcon(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDI_CABINET
)),
626 LoadCursor(NULL
, IDC_ARROW
), (HBRUSH
)(COLOR_WINDOW
+ 1), NULL
, szCabinetWndClass
, NULL
},
627 NULL
, NULL
, IDC_ARROW
, TRUE
, 0, _T("")
632 BEGIN_MSG_MAP(CShellBrowser
)
633 MESSAGE_HANDLER(WM_CREATE
, OnCreate
)
634 MESSAGE_HANDLER(WM_DESTROY
, OnDestroy
)
635 MESSAGE_HANDLER(WM_SIZE
, OnSize
)
636 MESSAGE_HANDLER(WM_INITMENUPOPUP
, OnInitMenuPopup
)
637 MESSAGE_HANDLER(WM_SETFOCUS
, OnSetFocus
)
638 MESSAGE_HANDLER(WM_MEASUREITEM
, RelayMsgToShellView
)
639 MESSAGE_HANDLER(WM_DRAWITEM
, RelayMsgToShellView
)
640 MESSAGE_HANDLER(WM_MENUSELECT
, RelayMsgToShellView
)
641 COMMAND_ID_HANDLER(IDM_FILE_CLOSE
, OnClose
)
642 COMMAND_ID_HANDLER(IDM_TOOLS_FOLDEROPTIONS
, OnFolderOptions
)
643 COMMAND_ID_HANDLER(IDM_TOOLS_MAPNETWORKDRIVE
, OnMapNetworkDrive
)
644 COMMAND_ID_HANDLER(IDM_TOOLS_DISCONNECTNETWORKDRIVE
, OnDisconnectNetworkDrive
)
645 COMMAND_ID_HANDLER(IDM_HELP_ABOUT
, OnAboutReactOS
)
646 COMMAND_ID_HANDLER(IDM_GOTO_BACK
, OnGoBack
)
647 COMMAND_ID_HANDLER(IDM_GOTO_FORWARD
, OnGoForward
)
648 COMMAND_ID_HANDLER(IDM_GOTO_UPONELEVEL
, OnGoUpLevel
)
649 COMMAND_ID_HANDLER(IDM_GOTO_HOMEPAGE
, OnGoHome
)
650 COMMAND_ID_HANDLER(IDM_FAVORITES_ORGANIZEFAVORITES
, OnOrganizeFavorites
)
651 COMMAND_ID_HANDLER(IDM_HELP_ISTHISCOPYLEGAL
, OnIsThisLegal
)
652 COMMAND_ID_HANDLER(IDM_VIEW_STATUSBAR
, OnToggleStatusBarVisible
)
653 COMMAND_ID_HANDLER(IDM_TOOLBARS_LOCKTOOLBARS
, OnToggleToolbarLock
)
654 COMMAND_ID_HANDLER(IDM_TOOLBARS_STANDARDBUTTONS
, OnToggleToolbarBandVisible
)
655 COMMAND_ID_HANDLER(IDM_TOOLBARS_ADDRESSBAR
, OnToggleAddressBandVisible
)
656 COMMAND_ID_HANDLER(IDM_TOOLBARS_LINKSBAR
, OnToggleLinksBandVisible
)
657 COMMAND_ID_HANDLER(IDM_TOOLBARS_TEXTLABELS
, OnToggleTextLabels
)
658 COMMAND_ID_HANDLER(IDM_TOOLBARS_CUSTOMIZE
, OnToolbarCustomize
)
659 COMMAND_ID_HANDLER(IDM_BACKSPACE
, OnBackspace
)
660 COMMAND_RANGE_HANDLER(IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, OnGoTravel
)
661 MESSAGE_HANDLER(WM_COMMAND
, RelayCommands
)
664 BEGIN_CONNECTION_POINT_MAP(CShellBrowser
)
665 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents2
)
666 CONNECTION_POINT_ENTRY(DIID_DWebBrowserEvents
)
667 END_CONNECTION_POINT_MAP()
669 BEGIN_COM_MAP(CShellBrowser
)
670 COM_INTERFACE_ENTRY_IID(IID_IDockingWindowSite
, IDockingWindowSite
)
671 COM_INTERFACE_ENTRY_IID(IID_IOleCommandTarget
, IOleCommandTarget
)
672 COM_INTERFACE_ENTRY2_IID(IID_IOleWindow
, IOleWindow
, IDockingWindowSite
)
673 COM_INTERFACE_ENTRY_IID(IID_IShellBrowser
, IShellBrowser
)
674 COM_INTERFACE_ENTRY_IID(IID_IDropTarget
, IDropTarget
)
675 COM_INTERFACE_ENTRY_IID(IID_IServiceProvider
, IServiceProvider
)
676 COM_INTERFACE_ENTRY_IID(IID_IProfferService
, IProfferService
)
677 COM_INTERFACE_ENTRY_IID(IID_IShellBrowserService
, IShellBrowserService
)
678 COM_INTERFACE_ENTRY_IID(IID_IDispatch
, IDispatch
)
679 COM_INTERFACE_ENTRY_IID(IID_IConnectionPointContainer
, IConnectionPointContainer
)
680 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser
, IWebBrowser
)
681 COM_INTERFACE_ENTRY_IID(IID_IWebBrowserApp
, IWebBrowserApp
)
682 COM_INTERFACE_ENTRY_IID(IID_IWebBrowser2
, IWebBrowser2
)
683 COM_INTERFACE_ENTRY_IID(IID_ITravelLogClient
, ITravelLogClient
)
684 COM_INTERFACE_ENTRY_IID(IID_IPersist
, IPersist
)
685 COM_INTERFACE_ENTRY_IID(IID_IPersistHistory
, IPersistHistory
)
686 COM_INTERFACE_ENTRY_IID(IID_IBrowserService
, IBrowserService
)
687 COM_INTERFACE_ENTRY_IID(IID_IBrowserService2
, IBrowserService2
)
691 extern HRESULT
CreateProgressDialog(REFIID riid
, void **ppv
);
693 CShellBrowser::CShellBrowser()
695 fCurrentShellViewWindow
= NULL
;
696 fCurrentDirectoryPIDL
= NULL
;
698 fStatusBarVisible
= true;
699 memset(fClientBars
, 0, sizeof(fClientBars
));
700 fCurrentMenuBar
= NULL
;
701 fHistoryObject
= NULL
;
702 fHistoryStream
= NULL
;
703 fHistoryBindContext
= NULL
;
706 CShellBrowser::~CShellBrowser()
710 HRESULT
CShellBrowser::Initialize(LPITEMIDLIST pidl
, long b
, long c
, long d
)
712 CComPtr
<IPersistStreamInit
> persistStreamInit
;
714 CComPtr
<IUnknown
> clientBar
;
716 _AtlInitialConstruct();
718 fCabinetState
.cLength
= sizeof(fCabinetState
);
719 if (ReadCabinetState(&fCabinetState
, sizeof(fCabinetState
)) == FALSE
)
724 Create(HWND_DESKTOP
);
729 hResult
= CoCreateInstance(CLSID_InternetToolbar
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &fClientBars
[BIInternetToolbar
].clientBar
));
730 if (FAILED_UNEXPECTEDLY(hResult
))
733 hResult
= CreateInternetToolbar(IID_PPV_ARG(IUnknown
, &clientBar
));
734 if (FAILED_UNEXPECTEDLY(hResult
))
738 fClientBars
[BIInternetToolbar
].clientBar
= clientBar
;
741 hResult
= clientBar
->QueryInterface(IID_PPV_ARG(IPersistStreamInit
, &persistStreamInit
));
742 if (FAILED_UNEXPECTEDLY(hResult
))
745 hResult
= IUnknown_SetSite(clientBar
, static_cast<IShellBrowser
*>(this));
746 if (FAILED_UNEXPECTEDLY(hResult
))
749 hResult
= IUnknown_Exec(clientBar
, CGID_PrivCITCommands
, 1, 1 /* or 0 */, NULL
, NULL
);
750 if (FAILED_UNEXPECTEDLY(hResult
))
753 // TODO: create settingsStream from registry entry
754 //if (settingsStream.p)
756 // hResult = persistStreamInit->Load(settingsStream);
757 // if (FAILED_UNEXPECTEDLY(hResult))
762 hResult
= persistStreamInit
->InitNew();
763 if (FAILED_UNEXPECTEDLY(hResult
))
767 hResult
= IUnknown_ShowDW(clientBar
, TRUE
);
768 if (FAILED_UNEXPECTEDLY(hResult
))
771 fToolbarProxy
.Initialize(m_hWnd
, clientBar
);
775 fStatusBar
= CreateWindow(STATUSCLASSNAMEW
, NULL
, WS_CHILD
| WS_VISIBLE
| WS_CLIPSIBLINGS
|
776 SBT_NOBORDERS
| SBT_TOOLTIPS
, 0, 0, 500, 20, m_hWnd
, (HMENU
)0xa001,
777 _AtlBaseModule
.GetModuleInstance(), 0);
778 fStatusBarVisible
= true;
782 hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_NEXT_HISTORY
);
783 if (FAILED_UNEXPECTEDLY(hResult
))
786 ShowWindow(SW_SHOWNORMAL
);
791 HRESULT
CShellBrowser::BrowseToPIDL(LPCITEMIDLIST pidl
, long flags
)
793 CComPtr
<IShellFolder
> newFolder
;
794 FOLDERSETTINGS newFolderSettings
;
797 // called by shell view to browse to new folder
798 // also called by explorer band to navigate to new folder
799 hResult
= SHBindToFolder(pidl
, &newFolder
);
800 if (FAILED_UNEXPECTEDLY(hResult
))
803 newFolderSettings
.ViewMode
= FVM_ICON
;
804 newFolderSettings
.fFlags
= 0;
805 hResult
= BrowseToPath(newFolder
, pidl
, &newFolderSettings
, flags
);
806 if (FAILED_UNEXPECTEDLY(hResult
))
811 BOOL WINAPI
_ILIsDesktop(LPCITEMIDLIST pidl
)
813 return (pidl
== NULL
|| pidl
->mkid
.cb
== 0);
816 BOOL WINAPI
_ILIsPidlSimple(LPCITEMIDLIST pidl
)
818 LPCITEMIDLIST pidlnext
;
823 if (! _ILIsDesktop(pidl
))
825 length
= pidl
->mkid
.cb
;
827 reinterpret_cast<LPCITEMIDLIST
>(
828 reinterpret_cast<const BYTE
*>(pidl
) + length
);
829 if (pidlnext
->mkid
.cb
!= 0)
835 HRESULT WINAPI
SHBindToFolderIDListParent(IShellFolder
*unused
, LPCITEMIDLIST pidl
,
836 const IID
*riid
, LPVOID
*ppv
, LPITEMIDLIST
*ppidlLast
)
838 CComPtr
<IShellFolder
> psf
;
839 LPITEMIDLIST pidlChild
;
840 LPITEMIDLIST pidlParent
;
847 if (ppidlLast
!= NULL
)
849 if (_ILIsPidlSimple(pidl
))
851 if (ppidlLast
!= NULL
)
852 *ppidlLast
= ILClone(pidl
);
853 hResult
= SHGetDesktopFolder((IShellFolder
**)ppv
);
857 pidlChild
= ILClone(ILFindLastID(pidl
));
858 pidlParent
= ILClone(pidl
);
859 ILRemoveLastID(pidlParent
);
860 hResult
= SHGetDesktopFolder(&psf
);
861 if (SUCCEEDED(hResult
))
862 hResult
= psf
->BindToObject(pidlParent
, NULL
, *riid
, ppv
);
863 if (SUCCEEDED(hResult
) && ppidlLast
!= NULL
)
864 *ppidlLast
= pidlChild
;
872 HRESULT
IEGetNameAndFlagsEx(LPITEMIDLIST pidl
, SHGDNF uFlags
, long param10
,
873 LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
875 CComPtr
<IShellFolder
> parentFolder
;
876 LPITEMIDLIST childPIDL
= NULL
;
880 hResult
= SHBindToFolderIDListParent(NULL
, pidl
, &IID_PPV_ARG(IShellFolder
, &parentFolder
), &childPIDL
);
884 hResult
= parentFolder
->GetDisplayNameOf(childPIDL
, uFlags
, &L108
);
888 StrRetToBufW(&L108
, childPIDL
, pszBuf
, cchBuf
);
891 hResult
= parentFolder
->GetAttributesOf(1, const_cast<LPCITEMIDLIST
*>(&childPIDL
), rgfInOut
);
904 long IEGetNameAndFlags(LPITEMIDLIST pidl
, SHGDNF uFlags
, LPWSTR pszBuf
, UINT cchBuf
, SFGAOF
*rgfInOut
)
906 return IEGetNameAndFlagsEx(pidl
, uFlags
, 0, pszBuf
, cchBuf
, rgfInOut
);
909 HRESULT
CShellBrowser::BrowseToPath(IShellFolder
*newShellFolder
,
910 LPCITEMIDLIST absolutePIDL
, FOLDERSETTINGS
*folderSettings
, long flags
)
912 CComPtr
<IObjectWithSite
> objectWithSite
;
913 CComPtr
<IShellFolder
> saveCurrentShellFolder
;
914 CComPtr
<IShellView
> saveCurrentShellView
;
915 CComPtr
<IShellView
> newShellView
;
916 CComPtr
<ITravelLog
> travelLog
;
917 HWND newShellViewWindow
;
918 BOOL windowUpdateIsLocked
;
919 RECT shellViewWindowBounds
;
922 wchar_t newTitle
[MAX_PATH
];
926 if (newShellFolder
== NULL
)
929 hResult
= GetTravelLog(&travelLog
);
930 if (FAILED_UNEXPECTEDLY(hResult
))
934 if (flags
& BTP_UPDATE_CUR_HISTORY
)
936 if (travelLog
->CountEntries(static_cast<IDropTarget
*>(this)) > 0)
937 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
938 // what to do with error? Do we want to halt browse because state save failed?
941 if (fCurrentShellView
)
943 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
946 // create view object
947 hResult
= newShellFolder
->CreateViewObject(m_hWnd
, IID_PPV_ARG(IShellView
, &newShellView
));
948 if (FAILED_UNEXPECTEDLY(hResult
))
950 previousView
= fCurrentShellViewWindow
;
952 // enter updating section
953 saveCursor
= SetCursor(LoadCursor(NULL
, IDC_WAIT
));
954 windowUpdateIsLocked
= LockWindowUpdate(TRUE
);
955 if (fCurrentShellView
!= NULL
)
956 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 0, 0);
959 hResult
= IUnknown_SetSite(newShellView
, static_cast<IDropTarget
*>(this));
961 // update folder and view
962 saveCurrentShellFolder
= fCurrentShellFolder
;
963 saveCurrentShellView
= fCurrentShellView
;
964 fCurrentShellFolder
= newShellFolder
;
965 fCurrentShellView
= newShellView
;
968 if (previousView
!= NULL
)
969 ::GetWindowRect(previousView
, &shellViewWindowBounds
);
971 ZeroMemory(&shellViewWindowBounds
, sizeof(shellViewWindowBounds
));
972 ::MapWindowPoints(0, m_hWnd
, reinterpret_cast<POINT
*>(&shellViewWindowBounds
), 2);
974 // create view window
975 hResult
= newShellView
->CreateViewWindow(saveCurrentShellView
, folderSettings
,
976 this, &shellViewWindowBounds
, &newShellViewWindow
);
977 if (FAILED_UNEXPECTEDLY(hResult
) || newShellViewWindow
== NULL
)
979 fCurrentShellView
= saveCurrentShellView
;
980 fCurrentShellFolder
= saveCurrentShellFolder
;
981 ::SendMessage(fCurrentShellViewWindow
, WM_SETREDRAW
, 1, 0);
982 if (windowUpdateIsLocked
)
983 LockWindowUpdate(FALSE
);
984 SetCursor(saveCursor
);
988 if (objectWithSite
.p
!= NULL
)
989 hResult
= objectWithSite
->SetSite(NULL
);
991 // update current pidl
992 ILFree(fCurrentDirectoryPIDL
);
993 fCurrentDirectoryPIDL
= ILClone(absolutePIDL
);
995 // update view window
996 if (saveCurrentShellView
!= NULL
)
997 saveCurrentShellView
->DestroyViewWindow();
998 fCurrentShellViewWindow
= newShellViewWindow
;
1001 saveCurrentShellView
.Release();
1002 saveCurrentShellFolder
.Release();
1004 hResult
= newShellView
->UIActivate(SVUIA_ACTIVATE_FOCUS
);
1006 // leave updating section
1007 if (windowUpdateIsLocked
)
1008 LockWindowUpdate(FALSE
);
1009 SetCursor(saveCursor
);
1012 if (flags
& BTP_UPDATE_NEXT_HISTORY
)
1014 hResult
= travelLog
->AddEntry(static_cast<IDropTarget
*>(this), FALSE
);
1015 hResult
= travelLog
->UpdateEntry(static_cast<IDropTarget
*>(this), FALSE
);
1019 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1020 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1021 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1022 if (SUCCEEDED(hResult
))
1024 FireNavigateComplete(newTitle
);
1028 FireNavigateComplete(L
"ERROR");
1031 if (fCabinetState
.fFullPathTitle
)
1032 nameFlags
= SHGDN_FORADDRESSBAR
| SHGDN_FORPARSING
;
1034 nameFlags
= SHGDN_FORADDRESSBAR
;
1035 hResult
= IEGetNameAndFlags(fCurrentDirectoryPIDL
, nameFlags
, newTitle
,
1036 sizeof(newTitle
) / sizeof(wchar_t), NULL
);
1037 if (SUCCEEDED(hResult
))
1039 SetWindowText(newTitle
);
1041 LPCITEMIDLIST pidlChild
;
1042 INT index
, indexOpen
;
1043 HIMAGELIST himlSmall
, himlLarge
;
1045 CComPtr
<IShellFolder
> sf
;
1046 SHBindToParent(absolutePIDL
, IID_PPV_ARG(IShellFolder
, &sf
), &pidlChild
);
1048 index
= SHMapPIDLToSystemImageListIndex(sf
, pidlChild
, &indexOpen
);
1050 Shell_GetImageLists(&himlLarge
, &himlSmall
);
1052 HICON icSmall
= ImageList_GetIcon(himlSmall
, indexOpen
, 0);
1053 HICON icLarge
= ImageList_GetIcon(himlLarge
, indexOpen
, 0);
1055 /* Hack to make it possible to release the old icons */
1056 /* Something seems to go wrong with WM_SETICON */
1057 HICON oldSmall
= (HICON
)SendMessage(WM_GETICON
, ICON_SMALL
, 0);
1058 HICON oldLarge
= (HICON
)SendMessage(WM_GETICON
, ICON_BIG
, 0);
1060 SendMessage(WM_SETICON
, ICON_SMALL
, reinterpret_cast<LPARAM
>(icSmall
));
1061 SendMessage(WM_SETICON
, ICON_BIG
, reinterpret_cast<LPARAM
>(icLarge
));
1063 DestroyIcon(oldSmall
);
1064 DestroyIcon(oldLarge
);
1067 FireCommandStateChangeAll();
1068 hResult
= UpdateForwardBackState();
1069 hResult
= UpdateUpState();
1073 HRESULT
CShellBrowser::GetMenuBand(REFIID riid
, void **shellMenu
)
1075 CComPtr
<IBandSite
> bandSite
;
1076 CComPtr
<IDeskBand
> deskBand
;
1079 if (!fClientBars
[BIInternetToolbar
].clientBar
)
1082 hResult
= IUnknown_QueryService(fClientBars
[BIInternetToolbar
].clientBar
, SID_IBandSite
, IID_PPV_ARG(IBandSite
, &bandSite
));
1083 if (FAILED_UNEXPECTEDLY(hResult
))
1086 hResult
= bandSite
->QueryBand(1, &deskBand
, NULL
, NULL
, 0);
1087 if (FAILED_UNEXPECTEDLY(hResult
))
1090 return deskBand
->QueryInterface(riid
, shellMenu
);
1093 HRESULT
CShellBrowser::GetBaseBar(bool vertical
, IUnknown
**theBaseBar
)
1095 CComPtr
<IUnknown
> newBaseBar
;
1096 CComPtr
<IDeskBar
> deskBar
;
1097 CComPtr
<IUnknown
> newBaseBarSite
;
1098 CComPtr
<IDeskBarClient
> deskBarClient
;
1103 cache
= &fClientBars
[BIVerticalBaseBar
].clientBar
.p
;
1105 cache
= &fClientBars
[BIHorizontalBaseBar
].clientBar
.p
;
1108 hResult
= CreateBaseBar(IID_PPV_ARG(IUnknown
, &newBaseBar
));
1109 if (FAILED_UNEXPECTEDLY(hResult
))
1111 hResult
= CreateBaseBarSite(IID_PPV_ARG(IUnknown
, &newBaseBarSite
));
1112 if (FAILED_UNEXPECTEDLY(hResult
))
1115 // tell the new base bar about the shell browser
1116 hResult
= IUnknown_SetSite(newBaseBar
, static_cast<IDropTarget
*>(this));
1117 if (FAILED_UNEXPECTEDLY(hResult
))
1120 // tell the new base bar about the new base bar site
1121 hResult
= newBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1122 if (FAILED_UNEXPECTEDLY(hResult
))
1124 hResult
= deskBar
->SetClient(newBaseBarSite
);
1125 if (FAILED_UNEXPECTEDLY(hResult
))
1128 // tell the new base bar site about the new base bar
1129 hResult
= newBaseBarSite
->QueryInterface(IID_PPV_ARG(IDeskBarClient
, &deskBarClient
));
1130 if (FAILED_UNEXPECTEDLY(hResult
))
1132 hResult
= deskBarClient
->SetDeskBarSite(newBaseBar
);
1133 if (FAILED_UNEXPECTEDLY(hResult
))
1136 *cache
= newBaseBar
.Detach();
1138 return (*cache
)->QueryInterface(IID_PPV_ARG(IUnknown
, theBaseBar
));
1141 HRESULT
CShellBrowser::ShowBand(const CLSID
&classID
, bool vertical
)
1143 CComPtr
<IDockingWindow
> dockingWindow
;
1144 CComPtr
<IUnknown
> baseBarSite
;
1145 CComPtr
<IUnknown
> newBand
;
1146 CComPtr
<IUnknown
> theBaseBar
;
1147 CComPtr
<IDeskBar
> deskBar
;
1151 hResult
= GetBaseBar(vertical
, (IUnknown
**)&theBaseBar
);
1152 if (FAILED_UNEXPECTEDLY(hResult
))
1155 #if USE_CUSTOM_EXPLORERBAND
1156 TRACE("ShowBand called for CLSID %s, vertical=%d...\n", wine_dbgstr_guid(&classID
), vertical
);
1157 if (IsEqualCLSID(CLSID_ExplorerBand
, classID
))
1159 TRACE("CLSID_ExplorerBand requested, building internal band.\n");
1160 hResult
= CExplorerBand_Constructor(IID_PPV_ARG(IUnknown
, &newBand
));
1161 if (FAILED_UNEXPECTEDLY(hResult
))
1167 TRACE("A different CLSID requested, using CoCreateInstance.\n");
1168 hResult
= CoCreateInstance(classID
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IUnknown
, &newBand
));
1169 if (FAILED_UNEXPECTEDLY(hResult
))
1172 hResult
= theBaseBar
->QueryInterface(IID_PPV_ARG(IDeskBar
, &deskBar
));
1173 if (FAILED_UNEXPECTEDLY(hResult
))
1175 hResult
= deskBar
->GetClient(&baseBarSite
);
1176 if (FAILED_UNEXPECTEDLY(hResult
))
1178 hResult
= theBaseBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
1179 if (FAILED_UNEXPECTEDLY(hResult
))
1181 V_VT(&vaIn
) = VT_UNKNOWN
;
1182 V_UNKNOWN(&vaIn
) = newBand
.p
;
1183 hResult
= IUnknown_Exec(baseBarSite
, CGID_IDeskBand
, 1, 1, &vaIn
, NULL
);
1184 if (FAILED_UNEXPECTEDLY(hResult
))
1186 hResult
= dockingWindow
->ShowDW(TRUE
);
1187 if (FAILED_UNEXPECTEDLY(hResult
))
1193 HRESULT
CShellBrowser::NavigateToParent()
1195 LPITEMIDLIST newDirectory
= ILClone(fCurrentDirectoryPIDL
);
1196 if (newDirectory
== NULL
)
1197 return E_OUTOFMEMORY
;
1198 if (_ILIsDesktop(newDirectory
))
1200 ILFree(newDirectory
);
1201 return E_INVALIDARG
;
1203 ILRemoveLastID(newDirectory
);
1204 HRESULT hResult
= BrowseToPIDL(newDirectory
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1205 ILFree(newDirectory
);
1206 if (FAILED_UNEXPECTEDLY(hResult
))
1211 BOOL CALLBACK
AddFolderOptionsPage(HPROPSHEETPAGE thePage
, LPARAM lParam
)
1213 PROPSHEETHEADER
* sheetInfo
= reinterpret_cast<PROPSHEETHEADER
*>(lParam
);
1214 if (sheetInfo
->nPages
>= folderOptionsPageCountMax
)
1216 sheetInfo
->phpage
[sheetInfo
->nPages
] = thePage
;
1217 sheetInfo
->nPages
++;
1221 HRESULT
CShellBrowser::DoFolderOptions()
1223 CComPtr
<IShellPropSheetExt
> folderOptionsSheet
;
1224 PROPSHEETHEADER m_PropSheet
;
1225 HPROPSHEETPAGE m_psp
[folderOptionsPageCountMax
];
1226 // CComPtr<IGlobalFolderSettings> globalSettings;
1227 // SHELLSTATE2 shellState;
1230 memset(m_psp
, 0, sizeof(m_psp
));
1231 memset(&m_PropSheet
, 0, sizeof(m_PropSheet
));
1233 // create sheet object
1234 hResult
= CoCreateInstance(CLSID_ShellFldSetExt
, NULL
, CLSCTX_INPROC_SERVER
,
1235 IID_PPV_ARG(IShellPropSheetExt
, &folderOptionsSheet
));
1236 if (FAILED_UNEXPECTEDLY(hResult
))
1239 // must set site in order for Apply to all Folders on Advanced page to be enabled
1240 hResult
= IUnknown_SetSite(folderOptionsSheet
, static_cast<IDispatch
*>(this));
1241 m_PropSheet
.phpage
= m_psp
;
1244 hResult
= CoCreateInstance(CLSID_GlobalFolderSettings
, NULL
, CLSCTX_INPROC_SERVER
, IID_PPV_ARG(IGlobalFolderSettings
, &globalSettings
));
1245 if (FAILED_UNEXPECTEDLY(hResult
))
1247 hResult
= globalSettings
->Get(&shellState
, sizeof(shellState
));
1248 if (FAILED_UNEXPECTEDLY(hResult
))
1253 hResult
= folderOptionsSheet
->AddPages(AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1254 if (FAILED_UNEXPECTEDLY(hResult
))
1257 // CORE-11140 : Disabled this bit, because it prevents the folder options from showing.
1258 // It returns 'E_NOTIMPL'
1260 if (fCurrentShellView
!= NULL
)
1262 hResult
= fCurrentShellView
->AddPropertySheetPages(
1263 0, AddFolderOptionsPage
, reinterpret_cast<LPARAM
>(&m_PropSheet
));
1264 if (FAILED_UNEXPECTEDLY(hResult
))
1270 m_PropSheet
.dwSize
= sizeof(PROPSHEETHEADER
);
1271 m_PropSheet
.dwFlags
= 0;
1272 m_PropSheet
.hwndParent
= m_hWnd
;
1273 m_PropSheet
.hInstance
= _AtlBaseModule
.GetResourceInstance();
1274 m_PropSheet
.pszCaption
= _T("Folder Options");
1275 m_PropSheet
.nStartPage
= 0;
1276 PropertySheet(&m_PropSheet
);
1280 LRESULT CALLBACK
CShellBrowser::WindowProc(HWND hWnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
1282 CShellBrowser
*pThis
= reinterpret_cast<CShellBrowser
*>(hWnd
);
1283 _ATL_MSG
msg(pThis
->m_hWnd
, uMsg
, wParam
, lParam
);
1285 const _ATL_MSG
*previousMessage
;
1287 WNDPROC saveWindowProc
;
1290 hWnd
= pThis
->m_hWnd
;
1291 previousMessage
= pThis
->m_pCurrentMsg
;
1292 pThis
->m_pCurrentMsg
= &msg
;
1294 CComPtr
<IMenuBand
> menuBand
;
1295 hResult
= pThis
->GetMenuBand(IID_PPV_ARG(IMenuBand
, &menuBand
));
1296 if (SUCCEEDED(hResult
) && menuBand
.p
!= NULL
)
1298 hResult
= menuBand
->TranslateMenuMessage(&msg
, &lResult
);
1299 if (hResult
== S_OK
)
1302 wParam
= msg
.wParam
;
1303 lParam
= msg
.lParam
;
1307 handled
= pThis
->ProcessWindowMessage(hWnd
, uMsg
, wParam
, lParam
, lResult
, 0);
1308 ATLASSERT(pThis
->m_pCurrentMsg
== &msg
);
1309 if (handled
== FALSE
)
1311 if (uMsg
== WM_NCDESTROY
)
1313 saveWindowProc
= reinterpret_cast<WNDPROC
>(::GetWindowLongPtr(hWnd
, GWL_WNDPROC
));
1314 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1315 if (saveWindowProc
== reinterpret_cast<WNDPROC
>(::GetWindowLongPtr(hWnd
, GWL_WNDPROC
)))
1316 ::SetWindowLongPtr(hWnd
, GWL_WNDPROC
, (LONG_PTR
)pThis
->m_pfnSuperWindowProc
);
1317 pThis
->m_dwState
|= WINSTATE_DESTROYED
;
1320 lResult
= pThis
->DefWindowProc(uMsg
, wParam
, lParam
);
1322 pThis
->m_pCurrentMsg
= previousMessage
;
1323 if (previousMessage
== NULL
&& (pThis
->m_dwState
& WINSTATE_DESTROYED
) != 0)
1325 pThis
->m_dwState
&= ~WINSTATE_DESTROYED
;
1326 pThis
->m_hWnd
= NULL
;
1327 pThis
->OnFinalMessage(hWnd
);
1332 void CShellBrowser::RepositionBars()
1338 GetClientRect(&clientRect
);
1340 if (fStatusBarVisible
&& fStatusBar
)
1342 ::GetWindowRect(fStatusBar
, &statusRect
);
1343 ::SetWindowPos(fStatusBar
, NULL
, clientRect
.left
, clientRect
.bottom
- (statusRect
.bottom
- statusRect
.top
),
1344 clientRect
.right
- clientRect
.left
,
1345 statusRect
.bottom
- statusRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1346 clientRect
.bottom
-= statusRect
.bottom
- statusRect
.top
;
1349 for (x
= 0; x
< 3; x
++)
1351 HWND hwnd
= fClientBars
[x
].hwnd
;
1352 RECT borderSpace
= fClientBars
[x
].borderSpace
;
1353 if (hwnd
== NULL
&& fClientBars
[x
].clientBar
!= NULL
)
1355 IUnknown_GetWindow(fClientBars
[x
].clientBar
, &hwnd
);
1356 fClientBars
[x
].hwnd
= hwnd
;
1360 RECT toolbarRect
= clientRect
;
1361 if (borderSpace
.top
!= 0)
1363 toolbarRect
.bottom
= toolbarRect
.top
+ borderSpace
.top
;
1365 else if (borderSpace
.bottom
!= 0)
1367 toolbarRect
.top
= toolbarRect
.bottom
- borderSpace
.bottom
;
1369 else if (borderSpace
.left
!= 0)
1371 toolbarRect
.right
= toolbarRect
.left
+ borderSpace
.left
;
1373 else if (borderSpace
.right
!= 0)
1375 toolbarRect
.left
= toolbarRect
.right
- borderSpace
.right
;
1378 ::SetWindowPos(hwnd
, NULL
,
1381 toolbarRect
.right
- toolbarRect
.left
,
1382 toolbarRect
.bottom
- toolbarRect
.top
,
1383 SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1385 if (borderSpace
.top
!= 0)
1387 clientRect
.top
= toolbarRect
.bottom
;
1389 else if (borderSpace
.bottom
!= 0)
1391 clientRect
.bottom
= toolbarRect
.top
;
1393 else if (borderSpace
.left
!= 0)
1395 clientRect
.left
= toolbarRect
.right
;
1397 else if (borderSpace
.right
!= 0)
1399 clientRect
.right
= toolbarRect
.left
;
1403 ::SetWindowPos(fCurrentShellViewWindow
, NULL
, clientRect
.left
, clientRect
.top
,
1404 clientRect
.right
- clientRect
.left
,
1405 clientRect
.bottom
- clientRect
.top
, SWP_NOOWNERZORDER
| SWP_NOZORDER
);
1408 HRESULT
CShellBrowser::FireEvent(DISPID dispIdMember
, int argCount
, VARIANT
*arguments
)
1411 CComDynamicUnkArray
&vec
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents2
>::m_vec
;
1412 CComDynamicUnkArray
&vec2
= IConnectionPointImpl
<CShellBrowser
, &DIID_DWebBrowserEvents
>::m_vec
;
1415 params
.rgvarg
= arguments
;
1416 params
.rgdispidNamedArgs
= NULL
;
1417 params
.cArgs
= argCount
;
1418 params
.cNamedArgs
= 0;
1419 IUnknown
** pp
= vec
.begin();
1420 while (pp
< vec
.end())
1424 CComPtr
<IDispatch
> theDispatch
;
1426 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1427 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1432 while (pp
< vec2
.end())
1436 CComPtr
<IDispatch
> theDispatch
;
1438 hResult
= (*pp
)->QueryInterface(IID_PPV_ARG(IDispatch
, &theDispatch
));
1439 hResult
= theDispatch
->Invoke(dispIdMember
, GUID_NULL
, 0, DISPATCH_METHOD
, ¶ms
, NULL
, NULL
, NULL
);
1446 HRESULT
CShellBrowser::FireNavigateComplete(const wchar_t *newDirectory
)
1448 // these two variants intentionally to do use CComVariant because it would double free/release
1449 // or does not need to dispose at all
1452 CComBSTR
tempString(newDirectory
);
1454 V_VT(&varArgs
) = VT_BSTR
;
1455 V_BSTR(&varArgs
) = tempString
.m_str
;
1457 V_VT(&varArg
[0]) = VT_VARIANT
| VT_BYREF
;
1458 V_VARIANTREF(&varArg
[0]) = &varArgs
;
1459 V_VT(&varArg
[1]) = VT_DISPATCH
;
1460 V_DISPATCH(&varArg
[1]) = (IDispatch
*)this;
1462 return FireEvent(DISPID_NAVIGATECOMPLETE2
, 2, varArg
);
1465 HRESULT
CShellBrowser::FireCommandStateChange(bool newState
, int commandID
)
1469 V_VT(&varArg
[0]) = VT_BOOL
;
1470 V_BOOL(&varArg
[0]) = newState
? VARIANT_TRUE
: VARIANT_FALSE
;
1471 V_VT(&varArg
[1]) = VT_I4
;
1472 V_I4(&varArg
[1]) = commandID
;
1474 return FireEvent(DISPID_COMMANDSTATECHANGE
, 2, varArg
);
1477 HRESULT
CShellBrowser::FireCommandStateChangeAll()
1479 return FireCommandStateChange(false, -1);
1482 HRESULT
CShellBrowser::UpdateForwardBackState()
1484 CComPtr
<ITravelLog
> travelLog
;
1485 CComPtr
<ITravelEntry
> unusedEntry
;
1491 canGoForward
= false;
1492 hResult
= GetTravelLog(&travelLog
);
1493 if (FAILED_UNEXPECTEDLY(hResult
))
1495 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_BACK
, &unusedEntry
);
1496 if (SUCCEEDED(hResult
))
1499 unusedEntry
.Release();
1501 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this), TLOG_FORE
, &unusedEntry
);
1502 if (SUCCEEDED(hResult
))
1504 canGoForward
= true;
1505 unusedEntry
.Release();
1507 hResult
= FireCommandStateChange(canGoBack
, 2);
1508 hResult
= FireCommandStateChange(canGoForward
, 1);
1512 HRESULT
CShellBrowser::UpdateUpState()
1518 if (_ILIsDesktop(fCurrentDirectoryPIDL
))
1520 hResult
= FireCommandStateChange(canGoUp
, 3);
1524 void CShellBrowser::UpdateGotoMenu(HMENU theMenu
)
1526 CComPtr
<ITravelLog
> travelLog
;
1527 CComPtr
<ITravelEntry
> unusedEntry
;
1529 MENUITEMINFO menuItemInfo
;
1532 DeleteMenuItems(theMenu
, IDM_GOTO_TRAVEL_FIRST
, IDM_GOTO_TRAVEL_LAST
);
1534 position
= GetMenuItemCount(theMenu
);
1535 hResult
= GetTravelLog(&travelLog
);
1536 if (FAILED_UNEXPECTEDLY(hResult
))
1539 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this),
1543 if (SUCCEEDED(hResult
))
1545 SHEnableMenuItem(theMenu
, IDM_GOTO_BACK
, TRUE
);
1546 unusedEntry
.Release();
1549 SHEnableMenuItem(theMenu
, IDM_GOTO_BACK
, FALSE
);
1551 hResult
= travelLog
->GetTravelEntry(static_cast<IDropTarget
*>(this),
1555 if (SUCCEEDED(hResult
))
1557 SHEnableMenuItem(theMenu
, IDM_GOTO_FORWARD
, TRUE
);
1558 unusedEntry
.Release();
1561 SHEnableMenuItem(theMenu
, IDM_GOTO_FORWARD
, FALSE
);
1563 SHEnableMenuItem(theMenu
,
1564 IDM_GOTO_UPONELEVEL
,
1565 !_ILIsDesktop(fCurrentDirectoryPIDL
));
1567 hResult
= travelLog
->InsertMenuEntries(static_cast<IDropTarget
*>(this), theMenu
, position
,
1568 IDM_GOTO_TRAVEL_FIRSTTARGET
, IDM_GOTO_TRAVEL_LASTTARGET
, TLMENUF_BACKANDFORTH
| TLMENUF_CHECKCURRENT
);
1569 if (SUCCEEDED(hResult
))
1571 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1572 menuItemInfo
.fMask
= MIIM_TYPE
| MIIM_ID
;
1573 menuItemInfo
.fType
= MF_SEPARATOR
;
1574 menuItemInfo
.wID
= IDM_GOTO_TRAVEL_SEP
;
1575 InsertMenuItem(theMenu
, position
, TRUE
, &menuItemInfo
);
1579 void CShellBrowser::UpdateViewMenu(HMENU theMenu
)
1581 CComPtr
<ITravelLog
> travelLog
;
1583 OLECMD commandList
[5];
1584 HMENU toolbarMenuBar
;
1586 MENUITEMINFO menuItemInfo
;
1589 gotoMenu
= SHGetMenuFromID(theMenu
, FCIDM_MENU_EXPLORE
);
1590 if (gotoMenu
!= NULL
)
1591 UpdateGotoMenu(gotoMenu
);
1593 commandList
[0].cmdID
= ITID_TOOLBARBANDSHOWN
;
1594 commandList
[1].cmdID
= ITID_ADDRESSBANDSHOWN
;
1595 commandList
[2].cmdID
= ITID_LINKSBANDSHOWN
;
1596 commandList
[3].cmdID
= ITID_TOOLBARLOCKED
;
1597 commandList
[4].cmdID
= ITID_CUSTOMIZEENABLED
;
1599 hResult
= IUnknown_QueryStatus(fClientBars
[BIInternetToolbar
].clientBar
,
1600 CGID_PrivCITCommands
, 5, commandList
, NULL
);
1601 if (FAILED_UNEXPECTEDLY(hResult
))
1602 DeleteMenu(theMenu
, IDM_VIEW_TOOLBARS
, MF_BYCOMMAND
);
1605 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1606 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1607 GetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1608 DestroyMenu(menuItemInfo
.hSubMenu
);
1610 toolbarMenuBar
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_CONTEXTMENU
));
1611 toolbarMenu
= GetSubMenu(toolbarMenuBar
, 0);
1612 RemoveMenu(toolbarMenuBar
, 0, MF_BYPOSITION
);
1613 DestroyMenu(toolbarMenuBar
);
1616 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
& OLECMDF_ENABLED
);
1617 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_ENABLED
);
1618 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_ENABLED
);
1619 SHEnableMenuItem(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, commandList
[4].cmdf
& OLECMDF_ENABLED
);
1621 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_STANDARDBUTTONS
, commandList
[0].cmdf
& OLECMDF_LATCHED
);
1622 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_ADDRESSBAR
, commandList
[1].cmdf
& OLECMDF_LATCHED
);
1623 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LINKSBAR
, commandList
[2].cmdf
& OLECMDF_LATCHED
);
1624 SHCheckMenuItem(toolbarMenu
, IDM_TOOLBARS_LOCKTOOLBARS
, commandList
[3].cmdf
& OLECMDF_LATCHED
);
1625 if ((commandList
[4].cmdf
& OLECMDF_ENABLED
) == 0)
1626 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_CUSTOMIZE
, MF_BYCOMMAND
);
1627 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_TEXTLABELS
, MF_BYCOMMAND
);
1628 DeleteMenu(toolbarMenu
, IDM_TOOLBARS_GOBUTTON
, MF_BYCOMMAND
);
1630 menuItemInfo
.cbSize
= sizeof(menuItemInfo
);
1631 menuItemInfo
.fMask
= MIIM_SUBMENU
;
1632 menuItemInfo
.hSubMenu
= toolbarMenu
;
1633 SetMenuItemInfo(theMenu
, IDM_VIEW_TOOLBARS
, FALSE
, &menuItemInfo
);
1635 SHCheckMenuItem(theMenu
, IDM_VIEW_STATUSBAR
, fStatusBarVisible
? TRUE
: FALSE
);
1638 SHEnableMenuItem(theMenu
, IDM_VIEW_EXPLORERBAR
, FALSE
);
1641 bool IUnknownIsEqual(IUnknown
*int1
, IUnknown
*int2
)
1643 CComPtr
<IUnknown
> int1Retry
;
1644 CComPtr
<IUnknown
> int2Retry
;
1649 if (int1
== NULL
|| int2
== NULL
)
1651 hResult
= int1
->QueryInterface(IID_PPV_ARG(IUnknown
, &int1Retry
));
1652 if (FAILED_UNEXPECTEDLY(hResult
))
1654 hResult
= int2
->QueryInterface(IID_PPV_ARG(IUnknown
, &int2Retry
));
1655 if (FAILED_UNEXPECTEDLY(hResult
))
1657 if (int1Retry
== int2Retry
)
1662 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBorderDW(IUnknown
*punkObj
, LPRECT prcBorder
)
1664 static const INT excludeItems
[] = { 1, 1, 1, 0xa001, 0, 0 };
1666 RECT availableBounds
;
1668 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
1669 for (INT x
= 0; x
< 3; x
++)
1671 if (fClientBars
[x
].clientBar
.p
!= NULL
&& !IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1673 availableBounds
.top
+= fClientBars
[x
].borderSpace
.top
;
1674 availableBounds
.left
+= fClientBars
[x
].borderSpace
.left
;
1675 availableBounds
.bottom
-= fClientBars
[x
].borderSpace
.bottom
;
1676 availableBounds
.right
-= fClientBars
[x
].borderSpace
.right
;
1679 *prcBorder
= availableBounds
;
1683 HRESULT STDMETHODCALLTYPE
CShellBrowser::RequestBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1688 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetBorderSpaceDW(IUnknown
* punkObj
, LPCBORDERWIDTHS pbw
)
1690 for (INT x
= 0; x
< 3; x
++)
1692 if (IUnknownIsEqual(fClientBars
[x
].clientBar
, punkObj
))
1694 fClientBars
[x
].borderSpace
= *pbw
;
1695 // if this bar changed size, it cascades and forces all subsequent bars to resize
1700 return E_INVALIDARG
;
1703 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatus(const GUID
*pguidCmdGroup
,
1704 ULONG cCmds
, OLECMD prgCmds
[ ], OLECMDTEXT
*pCmdText
)
1706 CComPtr
<IOleCommandTarget
> commandTarget
;
1709 if (prgCmds
== NULL
)
1710 return E_INVALIDARG
;
1711 if (pguidCmdGroup
== NULL
)
1713 if (fCurrentShellView
.p
!= NULL
)
1715 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &commandTarget
));
1716 if (SUCCEEDED(hResult
) && commandTarget
.p
!= NULL
)
1717 return commandTarget
->QueryStatus(NULL
, 1, prgCmds
, pCmdText
);
1726 else if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1730 switch (prgCmds
->cmdID
)
1732 case 0x1c: // search
1733 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1735 case 0x1d: // history
1736 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1738 case 0x1e: // favorites
1739 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
;
1741 case 0x23: // folders
1742 prgCmds
->cmdf
= OLECMDF_SUPPORTED
| OLECMDF_ENABLED
| OLECMDF_LATCHED
;
1752 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1756 switch (prgCmds
->cmdID
)
1758 case 0xa022: // up level
1759 prgCmds
->cmdf
= OLECMDF_SUPPORTED
;
1760 if (fCurrentDirectoryPIDL
->mkid
.cb
!= 0)
1761 prgCmds
->cmdf
|= OLECMDF_ENABLED
;
1771 HRESULT STDMETHODCALLTYPE
CShellBrowser::Exec(const GUID
*pguidCmdGroup
, DWORD nCmdID
,
1772 DWORD nCmdexecopt
, VARIANT
*pvaIn
, VARIANT
*pvaOut
)
1776 if (IsEqualIID(*pguidCmdGroup
, CGID_Explorer
))
1781 hResult
= ShowBand(CLSID_ExplorerBand
, true);
1784 if (nCmdexecopt
== 1)
1786 // pvaIn is a VT_UNKNOWN with a band that is being hidden
1790 // update zones part of the status bar
1793 case 0x35: // don't do this, and the internet toolbar doesn't create a menu band
1794 V_VT(pvaOut
) = VT_INT_PTR
;
1795 V_INTREF(pvaOut
) = reinterpret_cast<INT
*>(
1796 LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
)));
1799 // indicate if this cabinet was opened as a browser
1805 else if (IsEqualIID(*pguidCmdGroup
, CGID_InternetButtons
))
1814 else if (IsEqualIID(*pguidCmdGroup
, CGID_Theater
))
1819 // what is theater mode and why do we receive this?
1823 else if (IsEqualIID(*pguidCmdGroup
, CGID_MenuBand
))
1828 // initialize favorites menu
1832 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellDocView
))
1837 // refresh on toolbar clicked
1840 // tell the view if it should hide the task pane or not
1841 return (fClientBars
[BIVerticalBaseBar
].clientBar
.p
== NULL
) ? S_FALSE
: S_OK
;
1844 else if (IsEqualIID(*pguidCmdGroup
, CGID_ShellBrowser
))
1849 return NavigateToParent();
1852 else if (IsEqualIID(*pguidCmdGroup
, CGID_IExplorerToolbar
))
1857 return DoFolderOptions();
1860 else if (IsEqualIID(*pguidCmdGroup
, CGID_DefView
))
1865 // Reset All Folders option in Folder Options
1876 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindow(HWND
*lphwnd
)
1884 HRESULT STDMETHODCALLTYPE
CShellBrowser::ContextSensitiveHelp(BOOL fEnterMode
)
1889 HRESULT STDMETHODCALLTYPE
CShellBrowser::InsertMenusSB(HMENU hmenuShared
, LPOLEMENUGROUPWIDTHS lpMenuWidths
)
1891 HMENU mainMenu
= LoadMenu(_AtlBaseModule
.GetResourceInstance(), MAKEINTRESOURCE(IDM_CABINET_MAINMENU
));
1893 Shell_MergeMenus(hmenuShared
, mainMenu
, 0, 0, FCIDM_BROWSERLAST
, MM_SUBMENUSHAVEIDS
);
1895 int GCCU(itemCount3
) = GetMenuItemCount(hmenuShared
);
1898 DestroyMenu(mainMenu
);
1900 lpMenuWidths
->width
[0] = 2;
1901 lpMenuWidths
->width
[2] = 3;
1902 lpMenuWidths
->width
[4] = 1;
1906 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetMenuSB(HMENU hmenuShared
, HOLEMENU holemenuRes
, HWND hwndActiveObject
)
1908 CComPtr
<IShellMenu
> shellMenu
;
1911 if (hmenuShared
&& IsMenu(hmenuShared
) == FALSE
)
1913 hResult
= GetMenuBand(IID_PPV_ARG(IShellMenu
, &shellMenu
));
1914 if (FAILED_UNEXPECTEDLY(hResult
))
1919 // FIXME: Figure out the proper way to do this.
1920 HMENU hMenuFavs
= GetSubMenu(hmenuShared
, 3);
1923 DeleteMenu(hMenuFavs
, IDM_FAVORITES_EMPTY
, MF_BYCOMMAND
);
1927 hResult
= shellMenu
->SetMenu(hmenuShared
, m_hWnd
, SMSET_DONTOWN
);
1928 if (FAILED_UNEXPECTEDLY(hResult
))
1930 fCurrentMenuBar
= hmenuShared
;
1934 HRESULT STDMETHODCALLTYPE
CShellBrowser::RemoveMenusSB(HMENU hmenuShared
)
1936 if (hmenuShared
== fCurrentMenuBar
)
1938 //DestroyMenu(fCurrentMenuBar);
1939 SetMenuSB(NULL
, NULL
, NULL
);
1944 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetStatusTextSB(LPCOLESTR pszStatusText
)
1949 ::SetWindowText(fStatusBar
, pszStatusText
);
1958 HRESULT STDMETHODCALLTYPE
CShellBrowser::EnableModelessSB(BOOL fEnable
)
1963 HRESULT STDMETHODCALLTYPE
CShellBrowser::TranslateAcceleratorSB(MSG
*pmsg
, WORD wID
)
1965 if (!::TranslateAcceleratorW(m_hWnd
, m_hAccel
, pmsg
))
1970 HRESULT STDMETHODCALLTYPE
CShellBrowser::BrowseObject(LPCITEMIDLIST pidl
, UINT wFlags
)
1972 return BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
1975 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewStateStream(DWORD grfMode
, IStream
**ppStrm
)
1980 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetControlWindow(UINT id
, HWND
*lphwnd
)
1988 *lphwnd
= fToolbarProxy
.m_hWnd
;
1991 *lphwnd
= fStatusBar
;
1994 // find the directory browser and return it
1995 // this should be used only to determine if a tree is present
1998 // is this a progress dialog?
2004 HRESULT STDMETHODCALLTYPE
CShellBrowser::SendControlMsg(
2005 UINT id
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
, LRESULT
*pret
)
2014 result
= fToolbarProxy
.SendMessage(uMsg
, wParam
, lParam
);
2019 result
= SendMessage(fStatusBar
, uMsg
, wParam
, lParam
);
2027 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryActiveShellView(IShellView
**ppshv
)
2031 *ppshv
= fCurrentShellView
;
2032 if (fCurrentShellView
.p
!= NULL
)
2033 fCurrentShellView
.p
->AddRef();
2037 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnViewWindowActive(IShellView
*ppshv
)
2042 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetToolbarItems(LPTBBUTTON lpButtons
, UINT nButtons
, UINT uFlags
)
2047 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragEnter(
2048 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2053 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragOver(DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2058 HRESULT STDMETHODCALLTYPE
CShellBrowser::DragLeave()
2063 HRESULT STDMETHODCALLTYPE
CShellBrowser::Drop(
2064 IDataObject
*pDataObj
, DWORD grfKeyState
, POINTL pt
, DWORD
*pdwEffect
)
2069 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryService(REFGUID guidService
, REFIID riid
, void **ppvObject
)
2071 // view does a query for SID_STopLevelBrowser, IID_IShellBrowserService
2072 // the returned interface has a method GetPropertyBag on it
2073 if (IsEqualIID(guidService
, SID_STopLevelBrowser
))
2074 return this->QueryInterface(riid
, ppvObject
);
2075 if (IsEqualIID(guidService
, SID_SShellBrowser
))
2076 return this->QueryInterface(riid
, ppvObject
);
2077 if (IsEqualIID(guidService
, SID_ITargetFrame2
))
2078 return this->QueryInterface(riid
, ppvObject
);
2079 if (IsEqualIID(guidService
, SID_IWebBrowserApp
)) // without this, the internet toolbar won't reflect notifications
2080 return this->QueryInterface(riid
, ppvObject
);
2081 if (IsEqualIID(guidService
, SID_SProxyBrowser
))
2082 return this->QueryInterface(riid
, ppvObject
);
2083 if (IsEqualIID(guidService
, SID_IExplorerToolbar
))
2084 return fClientBars
[BIInternetToolbar
].clientBar
->QueryInterface(riid
, ppvObject
);
2085 if (IsEqualIID(riid
, IID_IShellBrowser
))
2086 return this->QueryInterface(riid
, ppvObject
);
2087 return E_NOINTERFACE
;
2090 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPropertyBag(long flags
, REFIID riid
, void **ppvObject
)
2092 if (ppvObject
== NULL
)
2098 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfoCount(UINT
*pctinfo
)
2103 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTypeInfo(UINT iTInfo
, LCID lcid
, ITypeInfo
**ppTInfo
)
2108 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetIDsOfNames(REFIID riid
, LPOLESTR
*rgszNames
,
2109 UINT cNames
, LCID lcid
, DISPID
*rgDispId
)
2114 HRESULT STDMETHODCALLTYPE
CShellBrowser::Invoke(DISPID dispIdMember
, REFIID riid
, LCID lcid
,
2115 WORD wFlags
, DISPPARAMS
*pDispParams
, VARIANT
*pVarResult
, EXCEPINFO
*pExcepInfo
, UINT
*puArgErr
)
2120 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetParentSite(IOleInPlaceSite
**ppipsite
)
2125 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTitle(IShellView
*psv
, LPCWSTR pszName
)
2130 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTitle(IShellView
*psv
, LPWSTR pszName
, DWORD cchName
)
2135 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetOleObject(IOleObject
**ppobjv
)
2140 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetTravelLog(ITravelLog
**pptl
)
2144 // called by toolbar when displaying tooltips
2149 if (fTravelLog
.p
== NULL
)
2151 hResult
= CreateTravelLog(IID_PPV_ARG(ITravelLog
, &fTravelLog
));
2152 if (FAILED_UNEXPECTEDLY(hResult
))
2155 *pptl
= fTravelLog
.p
;
2156 fTravelLog
.p
->AddRef();
2160 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowControlWindow(UINT id
, BOOL fShow
)
2165 HRESULT STDMETHODCALLTYPE
CShellBrowser::IsControlWindowShown(UINT id
, BOOL
*pfShown
)
2170 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEGetDisplayName(LPCITEMIDLIST pidl
, LPWSTR pwszName
, UINT uFlags
)
2175 HRESULT STDMETHODCALLTYPE
CShellBrowser::IEParseDisplayName(UINT uiCP
, LPCWSTR pwszPath
, LPITEMIDLIST
*ppidlOut
)
2180 HRESULT STDMETHODCALLTYPE
CShellBrowser::DisplayParseError(HRESULT hres
, LPCWSTR pwszPath
)
2185 HRESULT STDMETHODCALLTYPE
CShellBrowser::NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
)
2190 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetNavigateState(BNSTATE bnstate
)
2195 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetNavigateState(BNSTATE
*pbnstate
)
2200 HRESULT STDMETHODCALLTYPE
CShellBrowser::NotifyRedirect(IShellView
*psv
, LPCITEMIDLIST pidl
, BOOL
*pfDidBrowse
)
2205 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateWindowList()
2210 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateBackForwardState()
2215 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetFlags(DWORD dwFlags
, DWORD dwFlagMask
)
2220 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFlags(DWORD
*pdwFlags
)
2225 HRESULT STDMETHODCALLTYPE
CShellBrowser::CanNavigateNow()
2230 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPidl(LPITEMIDLIST
*ppidl
)
2232 // called by explorer bar to get current pidl
2235 *ppidl
= ILClone(fCurrentDirectoryPIDL
);
2239 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetReferrer(LPCITEMIDLIST pidl
)
2244 DWORD STDMETHODCALLTYPE
CShellBrowser::GetBrowserIndex()
2249 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBrowserByIndex(DWORD dwID
, IUnknown
**ppunk
)
2254 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetHistoryObject(IOleObject
**ppole
, IStream
**pstm
, IBindCtx
**ppbc
)
2256 if (ppole
== NULL
|| pstm
== NULL
|| ppbc
== NULL
)
2257 return E_INVALIDARG
;
2258 *ppole
= fHistoryObject
;
2259 if (fHistoryObject
!= NULL
)
2260 fHistoryObject
->AddRef();
2261 *pstm
= fHistoryStream
;
2262 if (fHistoryStream
!= NULL
)
2263 fHistoryStream
->AddRef();
2264 *ppbc
= fHistoryBindContext
;
2265 if (fHistoryBindContext
!= NULL
)
2266 fHistoryBindContext
->AddRef();
2267 fHistoryObject
= NULL
;
2268 fHistoryStream
= NULL
;
2269 fHistoryBindContext
= NULL
;
2275 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetHistoryObject(IOleObject
*pole
, BOOL fIsLocalAnchor
)
2280 HRESULT STDMETHODCALLTYPE
CShellBrowser::CacheOLEServer(IOleObject
*pole
)
2285 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetSetCodePage(VARIANT
*pvarIn
, VARIANT
*pvarOut
)
2290 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnHttpEquiv(
2291 IShellView
*psv
, BOOL fDone
, VARIANT
*pvarargIn
, VARIANT
*pvarargOut
)
2296 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPalette(HPALETTE
*hpal
)
2301 HRESULT STDMETHODCALLTYPE
CShellBrowser::RegisterWindow(BOOL fForceRegister
, int swc
)
2306 LRESULT STDMETHODCALLTYPE
CShellBrowser::WndProcBS(HWND hwnd
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2311 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAsDefFolderSettings()
2316 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewRect(RECT
*prc
)
2321 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSize(WPARAM wParam
)
2326 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnCreate(struct tagCREATESTRUCTW
*pcs
)
2328 m_hAccel
= LoadAcceleratorsW(GetModuleHandle(L
"browseui.dll"), MAKEINTRESOURCEW(256));
2332 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnCommand(WPARAM wParam
, LPARAM lParam
)
2337 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnDestroy()
2342 LRESULT STDMETHODCALLTYPE
CShellBrowser::OnNotify(struct tagNMHDR
*pnm
)
2347 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnSetFocus()
2352 HRESULT STDMETHODCALLTYPE
CShellBrowser::OnFrameWindowActivateBS(BOOL fActive
)
2357 HRESULT STDMETHODCALLTYPE
CShellBrowser::ReleaseShellView()
2362 HRESULT STDMETHODCALLTYPE
CShellBrowser::ActivatePendingView()
2367 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateViewWindow(
2368 IShellView
*psvNew
, IShellView
*psvOld
, LPRECT prcView
, HWND
*phwnd
)
2373 HRESULT STDMETHODCALLTYPE
CShellBrowser::CreateBrowserPropSheetExt(REFIID riid
, void **ppv
)
2378 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetViewWindow(HWND
*phwndView
)
2383 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetBaseBrowserData(LPCBASEBROWSERDATA
*pbbd
)
2388 LPBASEBROWSERDATA STDMETHODCALLTYPE
CShellBrowser::PutBaseBrowserData()
2393 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTravelLog(ITravelLog
*ptl
, DWORD dw
)
2398 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetTopBrowser()
2403 HRESULT STDMETHODCALLTYPE
CShellBrowser::Offline(int iCmd
)
2408 HRESULT STDMETHODCALLTYPE
CShellBrowser::AllowViewResize(BOOL f
)
2413 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetActivateState(UINT u
)
2418 HRESULT STDMETHODCALLTYPE
CShellBrowser::UpdateSecureLockIcon(int eSecureLock
)
2423 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeDownloadManager()
2428 HRESULT STDMETHODCALLTYPE
CShellBrowser::InitializeTransitionSite()
2433 HRESULT STDMETHODCALLTYPE
CShellBrowser::_Initialize(HWND hwnd
, IUnknown
*pauto
)
2438 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingNavigationAsync()
2443 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CancelPendingView()
2448 HRESULT STDMETHODCALLTYPE
CShellBrowser::_MaySaveChanges()
2453 HRESULT STDMETHODCALLTYPE
CShellBrowser::_PauseOrResumeView(BOOL fPaused
)
2458 HRESULT STDMETHODCALLTYPE
CShellBrowser::_DisableModeless()
2463 HRESULT STDMETHODCALLTYPE
CShellBrowser::_NavigateToPidl(LPCITEMIDLIST pidl
, DWORD grfHLNF
, DWORD dwFlags
)
2468 HRESULT STDMETHODCALLTYPE
CShellBrowser::_TryShell2Rename(IShellView
*psv
, LPCITEMIDLIST pidlNew
)
2473 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SwitchActivationNow()
2478 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ExecChildren(IUnknown
*punkBar
, BOOL fBroadcast
,
2479 const GUID
*pguidCmdGroup
, DWORD nCmdID
, DWORD nCmdexecopt
, VARIANTARG
*pvarargIn
, VARIANTARG
*pvarargOut
)
2484 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SendChildren(
2485 HWND hwndBar
, BOOL fBroadcast
, UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2490 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetFolderSetData(struct tagFolderSetData
*pfsd
)
2495 HRESULT STDMETHODCALLTYPE
CShellBrowser::_OnFocusChange(UINT itb
)
2500 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_ShowHideChildWindows(BOOL fChildOnly
)
2505 UINT STDMETHODCALLTYPE
CShellBrowser::_get_itbLastFocus()
2510 HRESULT STDMETHODCALLTYPE
CShellBrowser::_put_itbLastFocus(UINT itbLastFocus
)
2515 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UIActivateView(UINT uState
)
2520 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetViewBorderRect(RECT
*prc
)
2525 HRESULT STDMETHODCALLTYPE
CShellBrowser::_UpdateViewRectSize()
2530 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorder(UINT itb
)
2535 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeView()
2540 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetEffectiveClientArea(LPRECT lprectBorder
, HMONITOR hmon
)
2545 IStream
*STDMETHODCALLTYPE
CShellBrowser::v_GetViewStream(LPCITEMIDLIST pidl
, DWORD grfMode
, LPCWSTR pwszName
)
2550 LRESULT STDMETHODCALLTYPE
CShellBrowser::ForwardViewMsg(UINT uMsg
, WPARAM wParam
, LPARAM lParam
)
2555 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetAcceleratorMenu(HACCEL hacc
)
2560 int STDMETHODCALLTYPE
CShellBrowser::_GetToolbarCount()
2565 LPTOOLBARITEM STDMETHODCALLTYPE
CShellBrowser::_GetToolbarItem(int itb
)
2570 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SaveToolbars(IStream
*pstm
)
2575 HRESULT STDMETHODCALLTYPE
CShellBrowser::_LoadToolbars(IStream
*pstm
)
2580 HRESULT STDMETHODCALLTYPE
CShellBrowser::_CloseAndReleaseToolbars(BOOL fClose
)
2585 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayGetNextToolbarFocus(
2586 LPMSG lpMsg
, UINT itbNext
, int citb
, LPTOOLBARITEM
*pptbi
, HWND
*phwnd
)
2591 HRESULT STDMETHODCALLTYPE
CShellBrowser::_ResizeNextBorderHelper(UINT itb
, BOOL bUseHmonitor
)
2596 UINT STDMETHODCALLTYPE
CShellBrowser::_FindTBar(IUnknown
*punkSrc
)
2601 HRESULT STDMETHODCALLTYPE
CShellBrowser::_SetFocus(LPTOOLBARITEM ptbi
, HWND hwnd
, LPMSG lpMsg
)
2606 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_MayTranslateAccelerator(MSG
*pmsg
)
2608 for (int i
= 0; i
< 3; i
++)
2610 if (IUnknown_TranslateAcceleratorIO(fClientBars
[i
].clientBar
, pmsg
) == S_OK
)
2614 if (!fCurrentShellView
)
2617 return fCurrentShellView
->TranslateAcceleratorW(pmsg
);
2620 HRESULT STDMETHODCALLTYPE
CShellBrowser::_GetBorderDWHelper(IUnknown
*punkSrc
, LPRECT lprectBorder
, BOOL bUseHmonitor
)
2625 HRESULT STDMETHODCALLTYPE
CShellBrowser::v_CheckZoneCrossing(LPCITEMIDLIST pidl
)
2630 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoBack()
2632 CComPtr
<ITravelLog
> travelLog
;
2633 HRESULT hResult
= GetTravelLog(&travelLog
);
2634 if (FAILED_UNEXPECTEDLY(hResult
))
2636 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_BACK
);
2639 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoForward()
2641 CComPtr
<ITravelLog
> travelLog
;
2642 HRESULT hResult
= GetTravelLog(&travelLog
);
2643 if (FAILED_UNEXPECTEDLY(hResult
))
2645 return travelLog
->Travel(static_cast<IDropTarget
*>(this), TLOG_FORE
);
2648 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoHome()
2653 HRESULT STDMETHODCALLTYPE
CShellBrowser::GoSearch()
2658 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate(BSTR URL
, VARIANT
*Flags
,
2659 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2664 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh()
2668 V_VT(&level
) = VT_I4
;
2670 return Refresh2(&level
);
2673 HRESULT STDMETHODCALLTYPE
CShellBrowser::Refresh2(VARIANT
*Level
)
2675 CComPtr
<IOleCommandTarget
> oleCommandTarget
;
2678 hResult
= fCurrentShellView
->QueryInterface(IID_PPV_ARG(IOleCommandTarget
, &oleCommandTarget
));
2679 if (FAILED_UNEXPECTEDLY(hResult
))
2681 return oleCommandTarget
->Exec(NULL
, 22, 1, Level
, NULL
);
2684 HRESULT STDMETHODCALLTYPE
CShellBrowser::Stop()
2689 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Application(IDispatch
**ppDisp
)
2694 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Parent(IDispatch
**ppDisp
)
2699 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Container(IDispatch
**ppDisp
)
2704 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Document(IDispatch
**ppDisp
)
2709 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TopLevelContainer(VARIANT_BOOL
*pBool
)
2714 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Type(BSTR
*Type
)
2721 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Left(long *pl
)
2726 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Left(long Left
)
2731 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Top(long *pl
)
2736 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Top(long Top
)
2741 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Width(long *pl
)
2746 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Width(long Width
)
2751 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Height(long *pl
)
2756 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Height(long Height
)
2763 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationName(BSTR
*LocationName
)
2768 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_LocationURL(BSTR
*LocationURL
)
2773 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Busy(VARIANT_BOOL
*pBool
)
2778 HRESULT STDMETHODCALLTYPE
CShellBrowser::Quit()
2783 HRESULT STDMETHODCALLTYPE
CShellBrowser::ClientToWindow(int *pcx
, int *pcy
)
2788 HRESULT STDMETHODCALLTYPE
CShellBrowser::PutProperty(BSTR Property
, VARIANT vtValue
)
2793 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetProperty(BSTR Property
, VARIANT
*pvtValue
)
2798 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Name(BSTR
*Name
)
2803 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_HWND(SHANDLE_PTR
*pHWND
)
2808 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullName(BSTR
*FullName
)
2813 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Path(BSTR
*Path
)
2818 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Visible(VARIANT_BOOL
*pBool
)
2823 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Visible(VARIANT_BOOL Value
)
2828 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusBar(VARIANT_BOOL
*pBool
)
2833 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusBar(VARIANT_BOOL Value
)
2838 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_StatusText(BSTR
*StatusText
)
2843 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_StatusText(BSTR StatusText
)
2848 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ToolBar(int *Value
)
2853 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_ToolBar(int Value
)
2858 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_MenuBar(VARIANT_BOOL
*Value
)
2863 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_MenuBar(VARIANT_BOOL Value
)
2868 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_FullScreen(VARIANT_BOOL
*pbFullScreen
)
2873 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_FullScreen(VARIANT_BOOL bFullScreen
)
2878 HRESULT STDMETHODCALLTYPE
CShellBrowser::Navigate2(VARIANT
*URL
, VARIANT
*Flags
,
2879 VARIANT
*TargetFrameName
, VARIANT
*PostData
, VARIANT
*Headers
)
2881 // called from drive combo box to navigate to a directory
2882 if (V_VT(URL
) != (VT_ARRAY
| VT_UI1
))
2883 return E_INVALIDARG
;
2884 if (V_ARRAY(URL
)->cDims
!= 1 || V_ARRAY(URL
)->cbElements
!= 1)
2885 return E_INVALIDARG
;
2887 LPITEMIDLIST pidl
= static_cast<LPITEMIDLIST
>(V_ARRAY(URL
)->pvData
);
2888 HRESULT hResult
= BrowseToPIDL(pidl
, BTP_UPDATE_CUR_HISTORY
| BTP_UPDATE_NEXT_HISTORY
);
2889 if (FAILED_UNEXPECTEDLY(hResult
))
2894 HRESULT STDMETHODCALLTYPE
CShellBrowser::QueryStatusWB(OLECMDID cmdID
, OLECMDF
*pcmdf
)
2899 HRESULT STDMETHODCALLTYPE
CShellBrowser::ExecWB(OLECMDID cmdID
, OLECMDEXECOPT cmdexecopt
,
2900 VARIANT
*pvaIn
, VARIANT
*pvaOut
)
2905 HRESULT STDMETHODCALLTYPE
CShellBrowser::ShowBrowserBar(VARIANT
*pvaClsid
, VARIANT
*pvarShow
, VARIANT
*pvarSize
)
2910 // called to show search bar
2911 if (V_VT(pvaClsid
) != VT_BSTR
)
2912 return E_INVALIDARG
;
2913 CLSIDFromString(V_BSTR(pvaClsid
), &classID
);
2914 // TODO: properly compute the value of vertical
2916 return ShowBand(classID
, vertical
);
2919 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_ReadyState(READYSTATE
*plReadyState
)
2924 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Offline(VARIANT_BOOL
*pbOffline
)
2929 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Offline(VARIANT_BOOL bOffline
)
2934 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Silent(VARIANT_BOOL
*pbSilent
)
2939 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Silent(VARIANT_BOOL bSilent
)
2944 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsBrowser(VARIANT_BOOL
*pbRegister
)
2949 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsBrowser(VARIANT_BOOL bRegister
)
2954 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_RegisterAsDropTarget(VARIANT_BOOL
*pbRegister
)
2959 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_RegisterAsDropTarget(VARIANT_BOOL bRegister
)
2964 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_TheaterMode(VARIANT_BOOL
*pbRegister
)
2969 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_TheaterMode(VARIANT_BOOL bRegister
)
2974 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_AddressBar(VARIANT_BOOL
*Value
)
2979 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_AddressBar(VARIANT_BOOL Value
)
2984 HRESULT STDMETHODCALLTYPE
CShellBrowser::get_Resizable(VARIANT_BOOL
*Value
)
2989 HRESULT STDMETHODCALLTYPE
CShellBrowser::put_Resizable(VARIANT_BOOL Value
)
2994 HRESULT STDMETHODCALLTYPE
CShellBrowser::FindWindowByIndex(DWORD dwID
, IUnknown
**ppunk
)
2999 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetWindowData(IStream
*pStream
, LPWINDOWDATA pWinData
)
3001 if (pWinData
== NULL
)
3004 pWinData
->dwWindowID
= -1;
3006 pWinData
->pidl
= ILClone(fCurrentDirectoryPIDL
);
3007 pWinData
->lpszUrl
= NULL
;
3008 pWinData
->lpszUrlLocation
= NULL
;
3009 pWinData
->lpszTitle
= NULL
;
3013 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistoryPosition(LPWSTR pszUrlLocation
, DWORD dwPosition
)
3018 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetClassID(CLSID
*pClassID
)
3023 HRESULT STDMETHODCALLTYPE
CShellBrowser::LoadHistory(IStream
*pStream
, IBindCtx
*pbc
)
3025 CComPtr
<IPersistHistory
> viewPersistHistory
;
3026 CComPtr
<IOleObject
> viewHistoryObject
;
3027 persistState oldState
;
3032 hResult
= pStream
->Read(&oldState
, sizeof(oldState
), &numRead
);
3033 if (FAILED_UNEXPECTEDLY(hResult
))
3035 if (numRead
!= sizeof(oldState
) || oldState
.dwSize
!= sizeof(oldState
))
3037 if (oldState
.browseType
!= 2)
3039 pidl
= static_cast<LPITEMIDLIST
>(CoTaskMemAlloc(oldState
.pidlSize
));
3041 return E_OUTOFMEMORY
;
3042 hResult
= pStream
->Read(pidl
, oldState
.pidlSize
, &numRead
);
3043 if (FAILED_UNEXPECTEDLY(hResult
))
3048 if (numRead
!= oldState
.pidlSize
)
3053 hResult
= CoCreateInstance(oldState
.persistClass
, NULL
, CLSCTX_LOCAL_SERVER
| CLSCTX_INPROC_SERVER
,
3054 IID_PPV_ARG(IOleObject
, &viewHistoryObject
));
3055 fHistoryObject
= viewHistoryObject
;
3056 fHistoryStream
= pStream
;
3057 fHistoryBindContext
= pbc
;
3058 hResult
= BrowseToPIDL(pidl
, BTP_DONT_UPDATE_HISTORY
);
3059 fHistoryObject
= NULL
;
3060 fHistoryStream
= NULL
;
3061 fHistoryBindContext
= NULL
;
3063 if (FAILED_UNEXPECTEDLY(hResult
))
3068 HRESULT STDMETHODCALLTYPE
CShellBrowser::SaveHistory(IStream
*pStream
)
3070 CComPtr
<IPersistHistory
> viewPersistHistory
;
3071 persistState newState
;
3074 hResult
= fCurrentShellView
->GetItemObject(
3075 SVGIO_BACKGROUND
, IID_PPV_ARG(IPersistHistory
, &viewPersistHistory
));
3076 memset(&newState
, 0, sizeof(newState
));
3077 newState
.dwSize
= sizeof(newState
);
3078 newState
.browseType
= 2;
3079 newState
.browserIndex
= GetBrowserIndex();
3080 if (viewPersistHistory
.p
!= NULL
)
3082 hResult
= viewPersistHistory
->GetClassID(&newState
.persistClass
);
3083 if (FAILED_UNEXPECTEDLY(hResult
))
3086 newState
.pidlSize
= ILGetSize(fCurrentDirectoryPIDL
);
3087 hResult
= pStream
->Write(&newState
, sizeof(newState
), NULL
);
3088 if (FAILED_UNEXPECTEDLY(hResult
))
3090 hResult
= pStream
->Write(fCurrentDirectoryPIDL
, newState
.pidlSize
, NULL
);
3091 if (FAILED_UNEXPECTEDLY(hResult
))
3093 if (viewPersistHistory
.p
!= NULL
)
3095 hResult
= viewPersistHistory
->SaveHistory(pStream
);
3096 if (FAILED_UNEXPECTEDLY(hResult
))
3102 HRESULT STDMETHODCALLTYPE
CShellBrowser::SetPositionCookie(DWORD dwPositioncookie
)
3107 HRESULT STDMETHODCALLTYPE
CShellBrowser::GetPositionCookie(DWORD
*pdwPositioncookie
)
3112 LRESULT
CShellBrowser::OnCreate(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3114 OnCreate(reinterpret_cast<LPCREATESTRUCT
> (lParam
));
3118 LRESULT
CShellBrowser::OnDestroy(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3121 // TODO: rip down everything
3123 fCurrentShellView
->DestroyViewWindow();
3124 fCurrentShellView
->UIActivate(SVUIA_DEACTIVATE
);
3125 ReleaseCComPtrExpectZero(fCurrentShellView
);
3127 for (int i
= 0; i
< 3; i
++)
3129 if (fClientBars
[i
].clientBar
== NULL
)
3131 IDockingWindow
* pdw
;
3132 hr
= fClientBars
[i
].clientBar
->QueryInterface(IID_PPV_ARG(IDockingWindow
, &pdw
));
3133 if (FAILED_UNEXPECTEDLY(hr
))
3138 ReleaseCComPtrExpectZero(fClientBars
[i
].clientBar
);
3140 ReleaseCComPtrExpectZero(fTravelLog
);
3142 fCurrentShellFolder
.Release();
3143 ILFree(fCurrentDirectoryPIDL
);
3144 ::DestroyWindow(fStatusBar
);
3145 DestroyMenu(fCurrentMenuBar
);
3151 LRESULT
CShellBrowser::OnSize(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3153 CComPtr
<IDockingWindow
> dockingWindow
;
3154 RECT availableBounds
;
3155 static const INT excludeItems
[] = {1, 1, 1, 0xa001, 0, 0};
3158 if (wParam
!= SIZE_MINIMIZED
)
3160 GetEffectiveClientRect(m_hWnd
, &availableBounds
, excludeItems
);
3161 for (INT x
= 0; x
< 3; x
++)
3163 if (fClientBars
[x
].clientBar
!= NULL
)
3165 hResult
= fClientBars
[x
].clientBar
->QueryInterface(
3166 IID_PPV_ARG(IDockingWindow
, &dockingWindow
));
3167 if (SUCCEEDED(hResult
) && dockingWindow
!= NULL
)
3169 hResult
= dockingWindow
->ResizeBorderDW(
3170 &availableBounds
, static_cast<IDropTarget
*>(this), TRUE
);
3180 LRESULT
CShellBrowser::OnInitMenuPopup(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3183 LPARAM menuIndex
= lParam
;
3185 theMenu
= reinterpret_cast<HMENU
>(wParam
);
3187 if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FILE
))
3191 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_EDIT
))
3195 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_VIEW
))
3197 UpdateViewMenu(theMenu
);
3200 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_FAVORITES
))
3204 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_TOOLS
))
3206 // FIXME: Remove once implemented
3207 SHEnableMenuItem(theMenu
, IDM_TOOLS_MAPNETWORKDRIVE
, FALSE
);
3208 SHEnableMenuItem(theMenu
, IDM_TOOLS_DISCONNECTNETWORKDRIVE
, FALSE
);
3209 SHEnableMenuItem(theMenu
, IDM_TOOLS_SYNCHRONIZE
, FALSE
);
3210 FIXME("Folder options dialog is stubbed: CORE-11141\n");
3211 SHEnableMenuItem(theMenu
, IDM_TOOLS_FOLDEROPTIONS
, FALSE
); // Remove when CORE-11141 is fixed.
3214 else if (theMenu
== SHGetMenuFromID(fCurrentMenuBar
, FCIDM_MENU_HELP
))
3219 LRESULT ret
= RelayMsgToShellView(uMsg
, wParam
, menuIndex
, bHandled
);
3224 LRESULT
CShellBrowser::OnSetFocus(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3226 ::SetFocus(fCurrentShellViewWindow
);
3230 LRESULT
CShellBrowser::RelayMsgToShellView(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3232 if (fCurrentShellViewWindow
!= NULL
)
3233 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3237 LRESULT
CShellBrowser::OnClose(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3239 return SendMessage(WM_CLOSE
);
3242 LRESULT
CShellBrowser::OnFolderOptions(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3244 HRESULT hResult
= DoFolderOptions();
3245 if (FAILED(hResult
))
3246 TRACE("DoFolderOptions failed with hResult=%08lx\n", hResult
);
3250 LRESULT
CShellBrowser::OnMapNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3253 WNetConnectionDialog(m_hWnd
, RESOURCETYPE_DISK
);
3254 #endif /* __REACTOS__ */
3258 LRESULT
CShellBrowser::OnDisconnectNetworkDrive(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3261 WNetDisconnectDialog(m_hWnd
, RESOURCETYPE_DISK
);
3262 #endif /* __REACTOS__ */
3266 LRESULT
CShellBrowser::OnAboutReactOS(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3268 ShellAbout(m_hWnd
, _T("ReactOS"), _T(""), NULL
);
3272 LRESULT
CShellBrowser::OnGoBack(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3274 HRESULT hResult
= GoBack();
3275 if (FAILED(hResult
))
3276 TRACE("GoBack failed with hResult=%08lx\n", hResult
);
3280 LRESULT
CShellBrowser::OnGoForward(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3282 HRESULT hResult
= GoForward();
3283 if (FAILED(hResult
))
3284 TRACE("GoForward failed with hResult=%08lx\n", hResult
);
3288 LRESULT
CShellBrowser::OnGoUpLevel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3290 HRESULT hResult
= NavigateToParent();
3291 if (FAILED(hResult
))
3292 TRACE("NavigateToParent failed with hResult=%08lx\n", hResult
);
3296 LRESULT
CShellBrowser::OnGoHome(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3298 HRESULT hResult
= GoHome();
3299 if (FAILED(hResult
))
3300 TRACE("GoHome failed with hResult=%08lx\n", hResult
);
3304 LRESULT
CShellBrowser::OnBackspace(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3306 // FIXME: This does not appear to be what windows does.
3307 HRESULT hResult
= NavigateToParent();
3308 if (FAILED(hResult
))
3309 TRACE("NavigateToParent failed with hResult=%08lx\n", hResult
);
3313 LRESULT
CShellBrowser::OnOrganizeFavorites(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3315 CComPtr
<IShellFolder
> psfDesktop
;
3316 LPITEMIDLIST pidlFavs
;
3318 hr
= SHGetSpecialFolderLocation(m_hWnd
, CSIDL_FAVORITES
, &pidlFavs
);
3321 hr
= SHGetSpecialFolderLocation(m_hWnd
, CSIDL_COMMON_FAVORITES
, &pidlFavs
);
3326 hr
= SHGetDesktopFolder(&psfDesktop
);
3327 if (FAILED_UNEXPECTEDLY(hr
))
3330 hr
= SHInvokeDefaultCommand(m_hWnd
, psfDesktop
, pidlFavs
);
3331 if (FAILED_UNEXPECTEDLY(hr
))
3337 LRESULT
CShellBrowser::OnIsThisLegal(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3339 /* TODO: Implement properly */
3341 LPCWSTR strSite
= L
"https://www.reactos.org/user-faq";
3343 /* TODO: Make localizable */
3344 LPCWSTR strCaption
= L
"Sorry";
3345 LPCWSTR strMessage
= L
"ReactOS could not browse to '%s' (error %d). Please make sure there is a web browser installed.";
3346 WCHAR tmpMessage
[512];
3348 /* TODO: Read from the registry */
3349 LPCWSTR strVerb
= NULL
; /* default */
3350 LPCWSTR strPath
= strSite
;
3351 LPCWSTR strParams
= NULL
;
3353 /* The return value is defined as HINSTANCE for backwards compatibility only, the cast is needed */
3354 int result
= (int) ShellExecuteW(m_hWnd
, strVerb
, strPath
, strParams
, NULL
, SW_SHOWNORMAL
);
3357 StringCchPrintfW(tmpMessage
, 512, strMessage
, strSite
, result
);
3358 MessageBoxExW(m_hWnd
, tmpMessage
, strCaption
, MB_OK
, 0);
3364 LRESULT
CShellBrowser::OnToggleStatusBarVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3366 fStatusBarVisible
= !fStatusBarVisible
;
3369 ::ShowWindow(fStatusBar
, fStatusBarVisible
? SW_SHOW
: SW_HIDE
);
3375 LRESULT
CShellBrowser::OnToggleToolbarLock(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3378 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3379 CGID_PrivCITCommands
, ITID_TOOLBARLOCKED
, 0, NULL
, NULL
);
3383 LRESULT
CShellBrowser::OnToggleToolbarBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3386 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3387 CGID_PrivCITCommands
, ITID_TOOLBARBANDSHOWN
, 0, NULL
, NULL
);
3391 LRESULT
CShellBrowser::OnToggleAddressBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3394 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3395 CGID_PrivCITCommands
, ITID_ADDRESSBANDSHOWN
, 0, NULL
, NULL
);
3399 LRESULT
CShellBrowser::OnToggleLinksBandVisible(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3402 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3403 CGID_PrivCITCommands
, ITID_LINKSBANDSHOWN
, 0, NULL
, NULL
);
3407 LRESULT
CShellBrowser::OnToggleTextLabels(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3410 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3411 CGID_PrivCITCommands
, ITID_TEXTLABELS
, 0, NULL
, NULL
);
3415 LRESULT
CShellBrowser::OnToolbarCustomize(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3418 hResult
= IUnknown_Exec(fClientBars
[BIInternetToolbar
].clientBar
,
3419 CGID_PrivCITCommands
, ITID_CUSTOMIZEENABLED
, 0, NULL
, NULL
);
3423 LRESULT
CShellBrowser::OnGoTravel(WORD wNotifyCode
, WORD wID
, HWND hWndCtl
, BOOL
&bHandled
)
3428 LRESULT
CShellBrowser::RelayCommands(UINT uMsg
, WPARAM wParam
, LPARAM lParam
, BOOL
&bHandled
)
3430 if (HIWORD(wParam
) == 0 && LOWORD(wParam
) < FCIDM_SHVIEWLAST
&& fCurrentShellViewWindow
!= NULL
)
3431 return SendMessage(fCurrentShellViewWindow
, uMsg
, wParam
, lParam
);
3435 static HRESULT
ExplorerMessageLoop(IEThreadParamBlock
* parameters
)
3437 CComPtr
<CShellBrowser
> theCabinet
;
3442 // Tell the thread ref we are using it.
3443 if (parameters
&& parameters
->offsetF8
)
3444 parameters
->offsetF8
->AddRef();
3446 ATLTRY(theCabinet
= new CComObject
<CShellBrowser
>);
3447 if (theCabinet
== NULL
)
3449 return E_OUTOFMEMORY
;
3452 hResult
= theCabinet
->Initialize(parameters
->directoryPIDL
, 0, 0, 0);
3453 if (FAILED_UNEXPECTEDLY(hResult
))
3454 return E_OUTOFMEMORY
;
3456 while ((Ret
= GetMessage(&Msg
, NULL
, 0, 0)) != 0)
3460 // Error: continue or exit?
3464 if (Msg
.message
== WM_QUIT
)
3467 if (theCabinet
->v_MayTranslateAccelerator(&Msg
) != S_OK
)
3469 TranslateMessage(&Msg
);
3470 DispatchMessage(&Msg
);
3474 int nrc
= theCabinet
->Release();
3477 DbgPrint("WARNING: There are %d references to the CShellBrowser active or leaked.\n", nrc
);
3480 theCabinet
.Detach();
3482 // Tell the thread ref we are not using it anymore.
3483 if (parameters
&& parameters
->offsetF8
)
3484 parameters
->offsetF8
->Release();
3489 DWORD WINAPI
BrowserThreadProc(LPVOID lpThreadParameter
)
3492 IEThreadParamBlock
* parameters
= (IEThreadParamBlock
*) lpThreadParameter
;
3494 OleInitialize(NULL
);
3496 ATLTRY(hr
= ExplorerMessageLoop(parameters
));
3500 SHDestroyIETHREADPARAM(parameters
);