WriteRegistryValues会忽略由custom-action添加的临时行

时间:2012-08-15 13:47:25

标签: wix windows-installer custom-action

我正在写一个WIX脚本。

我有一个自定义操作,可以动态地将行添加到Registry表中:

function AddRegistry() 
{
    var registryView = Session.Database.OpenView("SELECT * FROM Registry");
    registryView.Execute();

    var record = Session.Installer.CreateRecord(6);
    record.StringData(1) = "Unique123456";
    record.IntegerData(2) = 2;
    record.StringData(3) = "Software";
    record.StringData(4) = "my_registry_string";
    record.StringData(5) = "value";
    record.StringData(6) = "MyComponent";

    registryView.Modify(7, record); //InsertTemporary
    registryView.Close();

    return 1; //Ok
}

自定义操作计划在“立即”和“WriteRegistryValues”操作之前运行:

<CustomAction Id="AddRegistry" BinaryKey="CustomActionJS" 
              JScriptCall="AddRegistry" 
              Execute="immediate" Impersonate="no" />

<InstallExecuteSequence>
    <Custom Action="AddRegistry" Before="WriteRegistryValues" />
    <Custom Action="CheckRegistry" After="WriteRegistryValues" />
...
</InstallExecuteSequence>

我添加了第二个自定义注册表的自定义操作,并显示刚找到的所有条目(固定和临时)。

但是,当执行WriteRegistryValues时(据我所知,它被推迟),它只会写入固定的条目。我的动态条目将被忽略,而不会添加到注册表中。

同一注册表路径的固定注册表项可以正常工作:

<Component Id="MyComponent">
    <RegistryValue Id="Unique11111" Root="HKLM" Key="Software" 
                   Name="my_fixed_value" Value="my_value" 
                   Action="write" Type="string"/>
</Component>

知道我做错了吗?

2 个答案:

答案 0 :(得分:2)

我是这样使用泛型方法:(示例在C#中使用DTF作为ActiveScript自定义操作,例如JScript / VBScript对于MSI是not a best practice

private static void InsertRecord(Session session, string tableName, Object[] objects)
{
  Database db = session.Database; 
  string sqlInsertSring = db.Tables[tableName].SqlInsertString + " TEMPORARY";
  session.Log("SqlInsertString is {0}", sqlInsertSring);
  View view = db.OpenView(sqlInsertSring); 
  view.Execute(new Record(objects)); 
  view.Close(); 
}

使用它看起来像

object[] fields = new object[] { .... };
InsertRecord(session, "TableName", fields);

答案 1 :(得分:1)

OK!

我认为我们 - 在Registry表中添加行的CA必须在 InstallValidate 之前运行(在 WriteRegistryValues 之前运行)

如此改变

<Custom Action="AddRegistry" Before="WriteRegistryValues" />

<Custom Action="AddRegistry" Before="InstallValidate" />

解决了问题