私は、この動作は、「インストールオンデマンド」と呼ばれるもの(別名「セルフヒール」)を含むことを学びました。セットアップパッケージによって作成される異常なショートカットは、「Advertised Shortcuts」と呼ばれます。問題の名前がわかったので、修正方法に関する情報を見つけるのは簡単です。注目すべきこと:
それらのページには、豊富な情報を含んでいます。この記事につきまとうかもしれない他の人の便宜のために、私は彼らの言うことを要約します:
広告されたショートカットは、すばらしいことをする特別なショートカットです。特に、ターゲットを起動する前に損傷したアプリケーションを再インストールします。彼らが良い、悪い、または無害であるかどうかについていくつかの議論があります。私の意見では、彼らはほとんどのユーザーが期待していない何かを行い、それはそれらを悪にします。したがって、私は自分のアプリケーションのためにそれらを無効にしたいと思います。
Visual Studioセットアッププロジェクトは、既定で通知されたショートカットを生成するMSIパッケージを自動的に作成します。 Setup.exeのコマンドライン引数としてDISABLEADVTSHORTCUTS = 1を使用してMSIパッケージをインストールするときに、そのデフォルトを上書きするのは簡単です。また、Orcaのようなユーティリティでは、MSIのプロパティとしてDISABLEADVTSHORTCUTS = 1を挿入することで、デフォルトを手動で変更できます。ただし、ビジュアルスタジオで、広告されたショートカットを作成しないMSIパッケージを自動的に作成するようにしたい場合は、それは難しくなります。私は、このようにそれをやった:
はまず、私は(私は下のそのコードを繰り返してきました)上記のリンクのいずれかにゲイリー・チャンが提供するDisableAdvtコードを使用してVBSファイルを作成しました。テキストファイルを作成し、コードに貼り付けます。 DisableAdvt.vbsとして保存します。
次に、セットアッププロジェクトのビルド後イベントを作成します。正確な構文は、ファイルの場所によって異なります。私DisableAdvt.vbsは、ソリューションフォルダの「ツール」サブフォルダにあるので、私のビルド後のイベントは次のようになります。
- 「$(PROJECTDIR).. \ツール\ DisableAdvt DisableAdvt.vbs \」「$ (BuiltOuputPath)」私がしなければならなかったすべてです
。それは魅力のように働く。
-TC
いくつかの注意:
のVisual Studio 2005では、イベントを作成しますが、彼らは、プロジェクトの他のタイプのためのものよりも、セットアッププロジェクトのために別々にアクセスされます。ソリューションエクスプローラでプロジェクト名をクリックし、プロパティパネルでPostBuildEventを探します。
Orcaは、DISABLEADVTSHORTCUTSプロパティをMSIファイルに手動で挿入するために使用できるユーティリティです。私のアプローチでは、オルカは必要ありません。ただし、ビルドイベントが期待通りの変更を行っていることを確認するのに便利です。ビルドイベントで
、スペルミス "BuiltOuputPathは" 意図的なものです。ここで
は(!私はライン21上のタイプミスを修正していることに注意してください - 非常に重要)ゲイリー・チャンのDisableAdvt.vbsコードです:
Option Explicit
Const msiOpenDatabaseModeTransact = 1
Dim argNum, argCount:argCount = Wscript.Arguments.Count
Dim openMode : openMode = msiOpenDatabaseModeTransact
' Connect to Windows installer object
On Error Resume Next
Dim installer : Set installer = Nothing
Set installer = Wscript.CreateObject("WindowsInstaller.Installer") :
CheckError
' Open database
Dim databasePath:databasePath = Wscript.Arguments(0)
Dim database : Set database = installer.OpenDatabase(databasePath, openMode) : CheckError
' Process SQL statements
Dim query, view, record, message, rowData, columnCount, delim, column
query = "INSERT INTO Property(Property, Value) VALUES ('DISABLEADVTSHORTCUTS', '1')"
Set view = database.OpenView(query) : CheckError
view.Execute : CheckError
database.Commit
If Not IsEmpty(message) Then Wscript.Echo message
Wscript.Quit 0
Sub CheckError
Dim message, errRec
If Err = 0 Then Exit Sub
message = Err.Source & " " & Hex(Err) & ": " & Err.Description
If Not installer Is Nothing Then
Set errRec = installer.LastErrorRecord
If Not errRec Is Nothing Then message = message & vbLf & errRec.FormatText
End If
Fail message
End Sub
Sub Fail(message)
Wscript.Echo message
Wscript.Quit 2
End Sub