1

私はWIXスクリプトを書いています。

レジストリテーブルに動的に行を追加するカスタムアクションがあります。

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>

レジストリテーブルを列挙し、見つかったすべてのエントリ(固定および一時)を表示する2番目のカスタムアクションを追加しました。

ただし、WriteRegistryValuesが実行されているとき(私が理解している限り、延期されています)、固定エントリのみが書き込まれます。動的エントリは無視され、レジストリに追加されません。

同じレジストリパスへの固定レジストリエントリは正常に機能します。

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

私が間違っていることについて何か考えはありますか?

4

2 に答える 2

2

私は一般的な方法を使用してこのように行います:(例は、JScript / VBScriptなどのActiveScriptカスタムアクションがMSIのベストプラクティスではないため、 DTFを使用するC#です)

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);
于 2012-08-15T15:11:39.470 に答える
1

わかった!

レジストリテーブルに行を追加するCAは、InstallValidateWriteRegistryValuesの前に実行される)の前に実行する必要があると考えました。

だから変わる

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

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

問題を解決しました

于 2012-08-15T21:59:47.390 に答える