我有一个MSI,它是我用一个WiX脚本动态构建的,它正在被很好地安装。然而,UninstallString一直都有一个指向msiexec.exe的/I (“斜眼”)参数,我认为它是一个/X。我读到过关于UninstallString here的文章,上面说这个注册表项是由Windows Installer设置的。我将通过WiX或我发出的install命令将什么传递给Windows Installer,这将导致UninstallString始终具有/I (“斜眼”)参数?
发布于 2012-05-02 23:06:59
我崩溃了,并就此与MS支持人员进行了交谈。答案是将MSI中的ARPNOMODIFY属性设置为1,以生成使用/X参数的UninstallString。
/I参数表示您可以在appwiz.cpl清单中使用"Change“和"Repair”选项。希望这对其他面临这个问题的人有所帮助。
下面的MSDN文章详细描述了ARP属性。
http://msdn.microsoft.com/en-us/library/windows/desktop/aa367590(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/aa367591(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/aa367592(v=vs.85).aspx
发布于 2012-04-26 06:53:06
您必须在WiX安装程序中创建一个ARPAltRegistryEntries组件来设置UninstallString。将参数设置为/I而不是预期的/X允许您使用自己的卸载UI。下面是一个示例:
<DirectoryRef Id="TARGETDIR">
<!-- Create alternative ARP entry that lets us launch uninstall with
full UI. Setting ARPSYSTEMCOMPONENT above hides WI generated key
that uses the product GUID.-->
<Component Id="ARPAltRegistryEntries" Guid="">
<RegistryKey Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Your Product" Action="createAndRemoveOnUninstall">
<RegistryValue Type="string" Name="UninstallString" Value="MsiExec.exe /i[ProductCode] REMOVE=ALL"/>
</RegistryKey>
</Component>
</DirectoryRef>发布于 2014-12-03 03:23:26
这个问题是针对Wix项目提出的,但是如果有人正在使用visual studio的安装项目,那么其中一个解决方案就是按照@joe Baltimore的建议,添加一个编译后vb脚本,将ARPNOMODIFY更改为1。
"setnomodify.vbs":如下所示,
Option Explicit
Const msiOpenDatabaseModeTransact = 1
Dim argNum, argCount:argCount = Wscript.Arguments.Count
Dim openMode : openMode = msiOpenDatabaseModeTransact
'This script adds a type 51 custom action into a given MSI database that
'ensures the ARPNOMODIFY is set to 1
' 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 ('ARPNOMODIFY', '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 PostBuildEvent = cscript "$(ProjectDir)setnomodify.vbs“"$(BuiltOuputPath)"
现在,每当您构建安装程序安装项目时,ARPNOMODIFY将被设置为1,并且已安装应用程序的Unistallstring在注册表中将具有"/X“而不是”/I
您也可以通过使用ORCA并将ARPNOMODIFY作为1添加到MSI的"Property“表中来手动完成此操作。
https://stackoverflow.com/questions/10280952
复制相似问题