РЕДАКТИРОВАТЬ Июнь 2010: MSI, который я создал, был под VS 2005 на Windows XP. Когда я пытался использовать тот же MSI для установки / удаления под Vista, удаление было не очень чистым. Я не оценил степень или причину, но я не рекомендую использовать это решение в Vista без дальнейшего изучения.
ОРИГИНАЛЬНАЯ ПОЧТА:
Я до сих пор не нашел реального решения моей проблемы, хотя обходной путь - немного хакерский - работает достаточно хорошо для моих целей. Я нашел предложение на каком-то другом сайте (я опубликую ссылку на него, если смогу найти его снова).
Я создал файл VBS, который имеет две функции: одна создает ярлык, а другая создает структуру каталогов по мере необходимости. Когда файл выполняется, он вызывает MakeShortcut столько раз, сколько разработчик сочтет нужным.
Второй файл VBS работает так же, но удаляет ярлыки.
Я вызываю первый файл как часть пользовательского действия (щелкните правой кнопкой мыши по проекту установки, ПРОСМОТР, ПОЛЬЗОВАТЕЛЬСКИЕ ДЕЙСТВИЯ) в папке Install. Я вызываю второй в папке Uninstall.
Проблема заключается в том, что два файла VBS устанавливаются в целевой каталог, а также в остальную часть программы. Возможно, есть способ избавиться от них, но мне все равно, что они там останутся. Опять же, это немного взломано и не так элегантно, как я надеялся, но оно работает достаточно хорошо, пока я не найду лучшего решения.
Вот два файла на случай, если кто-нибудь захочет их использовать:
'CREATE SHORTCUTS.VBS
MakeShortcut "%AllUsersProfile%\Start Menu\Programs\My Prog Folder", _
"My Prog", _
"%ProgramFiles%\My prog\prog.exe"
Function MakeShortcut (location, text, target)
Dim objShortcut
Dim objShell
Dim expLocation
Set objShell = CreateObject("WScript.Shell")
expLocation = objShell.ExpandEnvironmentStrings(location)
expTarget = objShell.ExpandEnvironmentStrings(target)
MakeDirectory(expLocation)
set objShortcut = objShell.CreateShortcut(expLocation & "\" & text & ".lnk")
objShortcut.TargetPath = expTarget
objShortcut.Save
End Function
Function MakeDirectory (newPath)
Dim objFSO
Dim arrPath
Dim length
Dim count
Dim path
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FolderExists(newPath) Then
Exit Function
End If
path = ""
count = 0
arrPath = split(newPath, "\")
length = ubound(arrPath)
While count <= length
path = path + arrPath(count) + "\"
count = count + 1
If Not objFSO.FolderExists(path) Then
objFSO.CreateFolder(path)
End If
Wend
End Function
УДАЛИТЬ ШОРТКУ.VBS
DeleteShortcut "%AllUsersProfile%\Start Menu\Programs\My Prog Folder", _
"My Prog.lnk", _
True
Function DeleteShortcut (location, shortcut, delLoc)
Dim objShortcut
Dim objShell
Dim expLocation
Set objShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
expLocation = objShell.ExpandEnvironmentStrings(location)
DeleteDirectory(expLocation)
If objFSO.FileExists(expLocation) Then
objFSO.DeleteFile expLocation & "\" & shortcut
End If
If delLoc = True Then
DeleteDirectory location
End If
End Function
Function DeleteDirectory (path)
Dim objFSO
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FolderExists(path) Then
objFSO.DeleteFolder path, True
End If
End Function