0

运行我的安装程序的条件之一是注册表中的值应该不同于“1”,否则它将显示错误消息并退出。

这不能通过自定义操作来完成,因为即使OnBeforeInstall事件发生在安装之后,所以用户可以在回滚之前终止设置。

如果我使用的是 WiX,它会很简单

<Condition Message="This application cannot be installed with SOMESOFTWARE v1. Setup now will exit.">
    <![CDATA[SOMESOFTWAREVERSION <> "#1"]]>
</Condition>

<Property Id="SOMESOFTWAREVERSION">
    <RegistrySearch Id="SomeSoftwareVersion"
                    Root="HKLM"
                    Key="SOFTWARE\Some Manufacturer\SomeSoftware"
                    Name="SomeSoftwareVersion"
                    Type="raw" />
</Property>

如果没有 WiX,我怎么能做同样的事情?

4

1 回答 1

0

您的 MSI 文件需要一个后期构建 JScript。或者您可以在 Orca 中手动完成。

var installer = WScript.CreateObject("WindowsInstaller.Installer");
var filespec = WScript.Arguments(0);
var msiOpenDatabaseModeTransact = 1;
var database = installer.OpenDatabase(filespec, msiOpenDatabaseModeTransact);

Execute("INSERT INTO `AppSearch` (`Property`, `Signature_`) VALUES ('SOMESOFTWAREVERSION', 'SomeSoftwareVersion')");
Execute("INSERT INTO `RegLocator` (`Signature_`, `Root`, `Key`, `Name`, `Type`) VALUES ('SomeSoftwareVersion', 2, 'SOFTWARE\\Some Manufacturer\\SomeSoftware', 'SomeSoftwareVersion', 2)");
Execute("INSERT INTO `LaunchCondition` (`Condition`, `Description`) VALUES ('SOMESOFTWAREVERSION <> \"#1\"', 'This application cannot be installed with SOMESOFTWARE v1. Setup now will exit.')");

function Execute(sql) {
    view = database.OpenView(sql);
    view.Execute();
    view.Close();
}

它将像 WiX 一样在 64 位 Windows 上检查 Wow6432Node

于 2013-06-26T11:39:11.360 回答