This function creates a shortcut. A remote application interface (RAPI) version of this function exists, CeSHCreateShortcut (RAPI). (From MSDN.)
[DllImport("coredll.dll")]
static extern int SHCreateShortcut(StringBuilder szShortcut, StringBuilder szTarget);
Private Declare Function SHCreateShortcut% Lib "coredll" (ByVal szShortcut As System.Text.StringBuilder, ByVal szTarget As System.Text.StringBuilder)!!!!User-Defined Types:
None.
None.
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".
Please add some!
/** 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);