2010年6月の編集:私が作成したMSIは、WindowsXPのVS2005でした。同じMSIを使用してVistaでインストール/アンインストールしようとしたとき、アンインストールはあまりクリーンではありませんでした。範囲や原因を評価していませんが、さらに調査せずにVistaでこのソリューションを使用することはお勧めしません。
元の投稿:
回避策(少しのハック)は私の目的には十分に機能しますが、問題の実際の解決策はまだ見つかりません。私は他のサイトで提案を見つけました(私が再びそれを見つけることができるならば、私はそれへのリンクを投稿します)。
2つの機能を持つVBSファイルを作成しました。1つはショートカットを作成し、もう1つは必要に応じてディレクトリ構造を作成します。ファイルが実行されると、開発者が適切と考える回数だけMakeShortcutが呼び出されます。
2番目のVBSファイルも同じように機能しますが、ショートカットが削除されます。
インストールフォルダーのカスタムアクション([セットアッププロジェクト]、[表示]、[カスタムアクション]を右クリック)の一部として最初のファイルを呼び出します。アンインストールフォルダの2番目を呼び出します。
問題は、2つのVBSファイルがプログラムの残りの部分と同様にターゲットディレクトリにインストールされることです。それらを取り除く方法はおそらくありますが、私はそれらがそこにとどまるのを本当に気にしません。繰り返しになりますが、これはちょっとしたハックであり、私が望んでいたほどエレガントではありませんが、より良い解決策が見つかるまでは十分に機能します。
誰かがそれらを使用したい場合に備えて、2つのファイルを次に示します。
'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
SHORTCUTS.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