Click here to Skip to main content
15,861,168 members
Articles / Desktop Programming / ATL
Article

Copy Path Context Menu Extension

Rate me:
Please Sign up or sign in to vote.
4.88/5 (14 votes)
9 May 2000 186.3K   2.7K   54   26
A context menu shell extension that allows you to copy full file paths to the clipboard.
  • Download source files - 270 Kb
  • Sample Image - CopyPathExt.jpg

    Introduction

    As a Windows programmer, one of the big headaches for me has been referencing fully qualified file paths. A file buried deep within the filesystem becomes a bear to deal with, as neither I nor any other programmers I know want to manually type

    "C:\Windows\System32\Drivers\SomeDriver\AnotherSubFolder\YetAnother\Will-It-Ever-End\MyFile.txt"

    time after time. This annoyance sent me on my initial foray into the land of context menu extensions, in the summer of 1997. I initially implemented this context menu extension as a MFC Dll, which got the job done, but it certainly wasn't pretty. Later, in May of '99, in the process of trying to familiarize myself with the ATL and the STL, I realized that I could make a much cleaner and more efficient version using ATL. So that's just what I did.

    This extension may seem to be derivative of Glenn Carr's recent article "Shell Extension to Copy Full Filename Path" (See the Article), but was developed independently (aside from some last-minute changes to GetCommandString to correctly deal with Unicode). Mine is simply another way to do pretty much the same thing, with some extras. I decided to post this alternative because it adds a few programmer-friendly features. There has also been a PowerToy in existence for quite a while that adds an option to the "Send To" menu allowing you to do basically the same thing, but once again, I thought that this implementation adds enough to make it worth posting.

    One hassle when dealing with file paths in C or C++ (or other similar languages, such as Perl) is the way that these languages deal with literal strings. They treat the backslash character as an escape sequence to insert special characters into the string (e.g "\n" for newline). In order to insert a single backslash into a literal string, two backslashes must be included in the code (e.g. "C:\\config.sys"). One can imagine how this would be a headache when dealing with a file that resides deep within a jumble of subdirectories. Another problem when dealing with file paths arises when dealing with legacy applications that don't take too kindly to long filenames or filenames with spaces.

    In addition to simply copying a file path to the clipboard, this extension offers functionality to remedy the above problems. By simply holding down the Control key while selecting the menu item, the "C-Friendly" path will be copied to the clipboard (e.g. "C:\\Windows\\System32\\user32.dll"). Holding down the Shift key will copy the short "DOS-Friendly" path (e.g. "C:\Progra~1\Multim~1\sound.wav"). And should the desire strike you, you can even hold down both with predictable results. The extension also sports multiple selection capability, file and/or directory selections, as well as anti-lock brakes and a no-scratch finish. Also, as Glenn Carr mentions in his article, with no programming effort on my part, running the extension on a shortcut copies the shortcut's target path to the clipboard.

    Code

    The code consists of an ATL DLL project with a single class, CCopyPathContextMenu. Like all context menus, it implements the IContextMenu and IShellExtInit interfaces. It also supports the IContextMenu2 and IContextMenu3 interfaces, but does not use their added functionality.

    • IShellExtInit::Initialize - Culls the selected file and directory names from the OLE data object and adds them to a STL list of basic strings.
    • IContextMenu::QueryContextMenu - Adds the new menu item to the context menu.
    • IContextMenu::GetCommandString - Provides help text for Explorer to display on the status bar.
    • IContextMenu::InvokeCommand - Called when the user selects our menu item, copying the directory and file names from the STL list filled in the Initialize function to the clipboard.

    Build Versions and Registering

    There are several build configurations you need to consider in the project:
    • bin\ReleaseUMinDependency\ - Unicode
    • bin\DebugU\ - Unicode
    • bin\ReleaseMinDependency\
    • bin\ReleaseMinSize\
    • bin\Debug\
    • bin\ReleaseUMinSize\ - Unicode

    To register the file, simply select the appropriate version of the DLL (remember that Unicode builds will not work correctly on Win95/98), copy it to an appropriate location (Windows System Directory recommended), and run "RegSvr32 CopyPathExt.dll" from the command line. The item "Copy Path to Clipboard" will now appear when you right-click on files or directories!

    License

    This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

    A list of licenses authors might use can be found here


    Written By
    United States United States
    <A HREF=http://www.unc.edu/~carrutt>Nicks's Web Page - My wild and crazy home on the web.

    Read the new issue of Modern Advances in Medicine (MAIM)!

    <A HREF=http://www.unc.edu/~carrutt/hearts_of_gold/>Hearts of Gold - Check out a silly game I wrote for the Macintosh (boo hiss) back in the winter of 1995.

    Comments and Discussions

     
    Question64-bit compatability? Pin
    Noob7667586755-Learning SQL + C#, Very Grate31-Mar-14 2:49
    Noob7667586755-Learning SQL + C#, Very Grate31-Mar-14 2:49 
    GeneralPerfect Pin
    michaelsheehy6-Jul-09 20:14
    michaelsheehy6-Jul-09 20:14 
    GeneralProblems on Win2008 Pin
    David Horner25-Jun-08 2:24
    David Horner25-Jun-08 2:24 
    GeneralRe: Problems on Win2008 Pin
    David Horner1-Jul-08 14:26
    David Horner1-Jul-08 14:26 
    GeneralRe: Problems on Win2008 Pin
    Gautam Jain10-Sep-08 5:05
    Gautam Jain10-Sep-08 5:05 
    GeneralRe: Problems on Win2008 Pin
    David Horner10-Sep-08 19:17
    David Horner10-Sep-08 19:17 
    Generalcontext menu within start menu bug Pin
    Brivolbm7q17-Aug-07 6:38
    Brivolbm7q17-Aug-07 6:38 
    GeneralHowto compile Copy Path Shell Extension in VS2005 Pin
    Jaguas24-Feb-07 9:41
    Jaguas24-Feb-07 9:41 
    GeneralThis is in Vista Pin
    IAteTheWholeThing26-Dec-06 22:52
    IAteTheWholeThing26-Dec-06 22:52 
    GeneralRe: This is in Vista Pin
    Jeffrey Walton11-Dec-06 15:41
    Jeffrey Walton11-Dec-06 15:41 
    GeneralRe: This is in Vista [modified] Pin
    Kaz Baygan26-Jan-09 17:26
    Kaz Baygan26-Jan-09 17:26 
    GeneralThis extension is awesome Pin
    jeng111127-Sep-06 9:25
    jeng111127-Sep-06 9:25 
    GeneralCopy Path Context Menu Extension Pin
    kallicat8-Sep-06 7:37
    kallicat8-Sep-06 7:37 
    QuestionDLL conflict with MS Image Preview Pin
    Osborn19-Jan-06 2:55
    Osborn19-Jan-06 2:55 
    QuestionUNC names? Pin
    jeed1-Dec-03 1:44
    jeed1-Dec-03 1:44 
    QuestionWhy include a typelibrary? Pin
    pmndr15-Nov-03 16:16
    pmndr15-Nov-03 16:16 
    GeneralPath-related problem Pin
    Eric at Cognos1-May-03 7:03
    Eric at Cognos1-May-03 7:03 
    GeneralRe: Path-related problem Pin
    EricT.13-May-04 2:36
    EricT.13-May-04 2:36 
    Found the problem Smile | :) Some unrelated task (don't know what) creates a file called Program into the root directory. This file is 0 bytes long. Because of this file, the file Programs takes precedence over the folder Program Files, and quotes are needed in services to insure the service can be started.
    GeneralI like it Pin
    Philippe Lhoste4-Dec-02 4:28
    Philippe Lhoste4-Dec-02 4:28 
    GeneralDragQueryFile with Shortcut Problem Pin
    Brad Brilliant1-Nov-00 4:11
    Brad Brilliant1-Nov-00 4:11 
    GeneralRe: DragQueryFile with Shortcut Problem Pin
    Nick Carruthers6-Nov-00 4:01
    Nick Carruthers6-Nov-00 4:01 
    GeneralRe: DragQueryFile with Shortcut Problem Pin
    Oleg Krivtsov12-Dec-05 2:32
    Oleg Krivtsov12-Dec-05 2:32 
    GeneralRe: DragQueryFile with Shortcut Problem Pin
    m.vinod8512-Jan-10 11:19
    m.vinod8512-Jan-10 11:19 
    GeneralThere's another extension like this Pin
    samzor14-May-00 20:32
    samzor14-May-00 20:32 
    GeneralRe: There's another extension like this Pin
    Nick Carruthers15-May-00 3:03
    Nick Carruthers15-May-00 3:03 

    General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

    Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.