0

ユーザーごとのインストールとマシンごとのインストールの両方をサポートするようにセットアップを作成しようとしています。ソフトウェアをユーザーごとにインストールするか、マシンごとにインストールするかをユーザーがラジオ ボタンで UI から選択し、その選択に基づいて、さまざまなカスタム アクションとコピーするさまざまなファイルを選択できるようにします。

util:XmlFile 要素を使用して、インストール スコープに基づいて異なるいくつかのファイルを変更できることがわかりましたが、問題は、UI によってプロパティが変更される前にこのコンポーネントが実行されることです。コードの断片は次のとおりです。

    <Property Id='ADXLoaderPrivileges' Value='bla' />
    <Directory Id="TARGETDIR" Name="SourceDir">
        <Component Id="adxloader.dll.manifest" Guid="51FC65CB-BEAD-4423-A840-49C9CB22E191">
            <File Id="adxloader.dll.manifest" Source="$(var.ExcelProjectDir)\Loader\adxloader.dll.manifest" DiskId="1" KeyPath="yes" />
            <util:XmlFile Id="ModifyAdxLoaderManifest" Action="setValue"
                          ElementPath="/configuration/loaderSettings/@privileges" File="[TARGETDIR]\adxloader.dll.manifest" Value="[ADXLoaderPrivileges]" />
        </Component>
    </Directory>

    <Dialog Id='AllUsersChoice' X='50' Y='50' Width='373' Height='287' Title='[ProductName]' TrackDiskSpace='yes'>
       <Control Id='NextButton' Type='PushButton' X='300' Y='261' Width='66' Height='18' Text='{\VSI_MS_Sans_Serif13.0_0_0}&amp;Next &gt;' TabSkip='no' Default='yes'>
         <Publish Property='TARGETDIR' Value='[%ProgramFiles]\Manufacturer\ProductName\'><![CDATA[ALLUSERS=2]]></Publish>
         <Publish Property='TARGETDIR' Value='[%APPDATA]\Manufacturer\ProductName\'><![CDATA[ALLUSERS=1]]></Publish>
         <Publish Property='ADXLoaderPrivileges' Value='administrator'><![CDATA[ALLUSERS=2]]></Publish>
         <Publish Property='ADXLoaderPrivileges' Value='user'><![CDATA[ALLUSERS=1]]></Publish>
       </Control>
    </Dialog>

ファイルは ALLUSERS プロパティ値に基づいてフォルダーにインストールされますが、XmlFile は「administrator」または「user」ではなく「bla」値で実行されます。

また、この選択に基づいて実行するカスタム アクションを指定するにはどうすればよいですか?

4

1 に答える 1

1

この問題は、インストーラーが使用するプロパティの範囲に関係しています。インストールの実行段階で利用可能なプロパティをユーザーがインストーラに渡せるようにする場合は、そのプロパティを公開する必要があります。プロパティを公開するのはとても簡単です。ALLCAPS と書くだけです。あなたの場合、に変換ADXLoaderPrivilegesする必要がありますADXLOADERPRIVILEGES

2番目の問題もかなり簡単に解決できます。orca や instedit などの適切なプログラムでプロジェクトをコンパイルした後、インストーラー データベースを確認してください。InstallUISequenceInstallExecuteSequenceテーブルを調べます。ここでは、すべての標準アクションとカスタム アクションを確認できます。各アクションが実行される順序は、列のエントリによって決まりSequenceます。すでにお気づきかもしれませんが、Condition列のエントリは、ここにリストされている条件に基づいて、アクションが実行されるかどうかを決定します。

CustomAction の条件を指定するには、次のリファレンスを使用します。

  1. 評価する条件を決定します。あなたの場合は ADXLOADERPRIVILEGES です
  2. CustomAction を記述します
  3. CustomAction をインストーラ データベースに挿入します。CustomActionこれは、要素の下にネストされた要素を作成するか、要素の下にネストProductするという 2 つの異なる方法で行うことができますFragment。a の下にネストする場合は、要素に要素Fragmentを追加する必要があります。最後のルールは、CustomAction を直接スケジュールしない場合にのみ適用されます。これは、たとえば、UI のボタンクリックによって CustomAction が実行される場合です。CustomActionRefProduct
  4. CustomAction をスケジュールします。Custom要素内の要素の下InstallUISequenceまたは下にInstallExecuteSequence要素を作成しますProduct。要素のAction属性は、要素内の属性によって指定されたCustomの名前です。CustomAction がいつ実行されるかを決定するには、エレメントの属性(絶対) を使用するか、または属性のいずれかを使用して、別のアクション (標準またはカスタム) の名前を指定します (相対)。CustomActionIdCustomActionSequenceCustomBeforeAfter
  5. 条件を CustomAction に追加します。このCustom要素は、条件のテキスト表現である 1 つの子要素を持つことができます。プレーン テキストを使用するか、テキストを CDATA タグに埋め込みます。

上記の概念が使用されているコードを次に示します。

CustomAction フラグメント

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
    <Binary Id="AlterSqlStringTable.DLL" SourceFile="$(var.AlterSqlStringTable.TargetDir)AlterSqlStringTable.CA.dll" />
    <CustomAction Id="AlterSqlStringTable" BinaryKey="AlterSqlStringTable.DLL" DllEntry="AlterSqlStringTable" Execute="immediate" Return="check" />
    </Fragment>
</Wix>

要素を持つ製品Custom:

<?xml version="1.0" encoding="UTF-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Id="*" Name="!(loc.Name)" Codepage="1252" Language="!(loc.Lang)" Version="YO.UR.VERS.ION" Manufacturer="!(loc.Manufacturer)" UpgradeCode="PUT-YOUR-GUID-HERE">
        ...
        <InstallExecuteSequence>
          <Custom Action="AlterSqlStringTable" Before="InstallFiles"><![CDATA[ADXLOADERPRIVILEGES = "administrator"]]></Custom>
        </InstallExecuteSequence>
        ...
    </Product>
</Wix>
于 2013-10-23T09:48:40.857 に答える