SHCreateShortcut (coredll)
Last changed: -91.122.14.199

.

Summary:

This function creates a shortcut. A remote application interface (RAPI) version of this function exists, CeSHCreateShortcut (RAPI). (From MSDN.)

C# Signature:

[DllImport("coredll.dll")]
static extern int SHCreateShortcut(StringBuilder szShortcut, StringBuilder szTarget);

VB Signature:

Private Declare Function SHCreateShortcut% Lib "coredll" (ByVal szShortcut As System.Text.StringBuilder, ByVal szTarget As System.Text.StringBuilder)!!!!User-Defined Types:

None.

Alternative Managed API:

None.

Notes:

It seems szTarget should start and end with a double-quote if it contains spaces -- so, you should always quote it. szShortcut should end with ".lnk".

Tips & Tricks:

Please add some!

Sample Code:

    /** Put a shortcut to Program Files\Foo\Foo.exe in Windows\Start Menu\Programs **/

    [DllImport("coredll.dll")]
    static extern int SHGetSpecialFolderPath(IntPtr hwndOwner, StringBuilder lpszPath, int nFolder, int fCreate);
    [DllImport("coredll.dll")]
    static extern int SHCreateShortcut(StringBuilder szShortcut, StringBuilder szTarget);

    const int CSIDL_PROGRAMS = 2;  // \Windows\Start Menu\Programs

    // Get location of "Programs" folder
    StringBuilder programs = new StringBuilder(255);
    SHGetSpecialFolderPath((IntPtr)0, programs, PlatformUtil.CSIDL_PROGRAMS, 0);

    StringBuilder shortcutLocation = new StringBuilder(Path.Combine(programs.ToString(), "Foo.lnk");
    // Note that we quote the path
    StringBuilder shortcutTarget = new StringBuilder("\"" + @"\Program Files\Foo\Foo.exe" + "\"");
    bool rv = PlatformUtil.SHCreateShortcut(shortcutLocation, shortcutTarget);

Documentation:

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wceui40/html/cerefSHCreateShortcut.asp