The Wayback Machine - https://web.archive.org/web/20090815163349/http://www.codeguru.com:80/cpp/com-tech/shell/article.php/c4521

CodeGuru
Earthweb Search
Login Forums Wireless Jars Gamelan Developer.com
CodeGuru Navigation
RSS Feeds

RSSAll

RSSVC++/C++

RSS.NET/C#

RSSVB

See more EarthWeb Network feeds

follow us on Twitter

Member Sign In
User ID:
Password:
Remember Me:
Forgot Password?
Not a member?
Click here for more information and to register.

jobs.internet.com

internet.commerce
Partners & Affiliates
















Home >> Visual C++ / C++ >> COM-based Technologies >> Shell Programming


Imitating Windows Explorer
Rating: none

Leon Finker (view profile)
May 23, 2001

I wandered how I can simulate the Windows explorer listview of files. Here is what I found. It might be useful to someone. If you create a simple listview control and populate it with files/folders, you'll notice that you can't:

  • Easily detect changes to files (rename, delete, copy/move...etc) while user is viewing the list
  • Send To menu is not populated if you try to use the shell's menu for your items
  • There doesn't seem to be a way of getting the column names used in shellview (filename, size, owner, times, and many others)

(continued)




I found that Windows explorer and File Open dialog expose IShellBrowser, which is used by IShellFolder/IShellView to create the listview of files.  So, I created a simple app with WTL.  Implemented basic IShellBrowser methods and exposed it to IShellView through IShellFolder::CreateViewObject.  Finally, to create the listview I called IShellView::CreateViewWindow.  I didn't try to merge the menus.
Things I couldn't get to work:

  • Toolbar buttons (they were added to my toolbar, but bitmaps were messed up). They do function however.
  • The most important one for me was that I couldn't easily detect when user wanted to open/explore/search the selected folder so  I could sync the file tree.

The IShellBrowser::BrowseObject was never even called, so I didn't implement it, but it should be implemented because most NSEs use this method.  I did find that the shellview sends WM_DDE* messages and if you respond properly you'll get the info about the action user taken. The needed messages are WM_DDE_INITIATE, WM_DDE_EXECUTE, WM_DDE_TERMINATEWM_DDE_EXECUTE will give you string such as

 "[ViewFolder("C:\Documents and Settings\leon\Desktop\billing", :428:780, 1)]"

I have no idea what the 428:780 stand for, but action would be ViewFolder/ExploreFolder/FindFolder.  It would be nice if Microsoft documented this stuff so we could use it correctly.  In the MSDN they state, "You do not implement this interface directly. IShellBrowser is implemented by Windows Explorer and by the Windows File Open common dialog box." Why did they tell us about WM_GETISHELLBROWSER? Anyway, maybe it would be useful to someone, so here it is.

Some useful points:

  • To get drag drop functioning in shellview, call OleInitialize/OleUninitialize 
  • Make sure you respond properly to WM_GETISHELLBROWSER or CreateView might crash
  • Details listview seems to work only with FVM_DETAILS and FWF_SNAPTOGRID combination
  • ICommDlgBrowser can be supported to have a simple listview like in common file dialog boxes (without webview)
  • Don't name your executable as explorer.exe or unpleasant things will happen



Useful links:

EnumDesk

Sample for enumerating/navigating folders/files (comes with PSDK) I have it under
C:\Program Files\Microsoft Platform SDK\Samples\WinUI\Shell

Q157247 - PRB: IShellFolder::CreateViewObject() Causes Access Violation

IShellBrowser

IShellFolder

IShellView

Comments in the Shell Object Header File (shlobj.h) are useful.

Downloads


Explorer.zip - 14.2K

Tools:
Add www.codeguru.com to your favorites
Add www.codeguru.com to your browser search box
IE 7 | Firefox 2.0 | Firefox 1.5.x
Receive news via our XML/RSS feed







RATE THIS ARTICLE:   Excellent  Very Good  Average  Below Average  Poor  

(You must be signed in to rank an article. Not a member? Click here to register)

Latest Comments:
events and class wizard - Legacy CodeGuru (06/06/2001)
thanx leon....another question - Legacy CodeGuru (06/06/2001)
How to detect folder open... - Legacy CodeGuru (05/29/2001)
why doesn't class wizard work? - Legacy CodeGuru (05/29/2001)
explorer - Legacy CodeGuru (05/27/2001)

View All Comments
Add a Comment:
Title:
Comment:
Pre-Formatted: Check this if you want the text to display with the formatting as typed (good for source code)



(You must be signed in to comment on an article. Not a member? Click here to register)