0

インストール中に条件付きでファイル拡張子を設定したいと思います。私が理解しているように、Wix で条件付きで何かを行うには、自己完結型のコンポーネントである必要があります。したがって、ユーザーが設定できるようにしたいファイルタイプの関連付けごとに、次のようなコンポーネントがあります。

<Component Id="FileAssocComponent_PS" Guid="DAFE9461-2DF0-934A-F204-6B28CEA23C01">
  <Condition>FILE_ASSOC_PS</Condition>
  <RegistryValue Root="HKLM" Key="SOFTWARE\PrinterApp\Capabilities\FileAssociations" Name=".prn" Value="PrinterApp.ps" Type="string" />
  <RegistryValue Root="HKLM" Key="SOFTWARE\PrinterApp\Capabilities\MIMEAssociations" Name="application/postscript" Value="PrinterApp.ps" Type="string" />
  <RegistryValue Root="HKLM" Key="SOFTWARE\Classes\PrinterApp.ps" Name="FriendlyTypeName" Value="PostScript File" Type="string" />
  <ProgId Id="PrinterApp.ps" Description="PostScript File" Icon="PrinterApp.ico" Advertise="yes">
    <Extension Id="ps">
      <Verb Id="open" Command="Open" Argument="&quot;%1&quot;"/>
    </Extension>
  </ProgId>
</Component>

しかし、これにより次のエラーが発生します。

error LGHT0204: ICE19: Extension: 'ps' advertises component: 'FileAssocComponent_PS'. This component cannot be advertised because the KeyPath type disallows it.

レジストリ エントリの 1 つで KeyPath="yes" を設定しようとしましたが、うまくいきません。しかし、これはファイルを含まないコンポーネントです!

このエラーを回避するにはどうすればよいですか、それとも間違った方法で行っていますか?

4

3 に答える 3

3

アドバタイズされたコンポーネントにはキーファイルが必要なので、エラーを回避する方法をいくつか示します。

1)

システムに害を及ぼさない偽のファイル ( printermimeinstalled.txt ) をコンポーネントに与えます。

2)

このコンポーネントのキーファイルとして PrinterAppMime.ps を作成します。CopyFile 要素を使用して、PrinterApp.ps にコピーされたファイルを取得します。

別のコンポーネントのキーファイルとして PrinterAppNoMime.ps (同じ内容) を作成します。また、CopyFile 要素を使用して、ファイルを PrinterApp.ps にコピーします。このコンポーネントに相互に排他的なコンポーネント条件を指定して、1 つのコンポーネントのみがインストールされるようにします。

3)

アプリのデザインを少し変更します。PrinterApp.ps を常にインストールし、PrinterAppMimeServer.ps を条件付きでインストールします。

4)

このカスタム アクションを削除し、カスタム アクションを使用してインストール時に MSI 一時テーブルの行を作成し、チェックボックスが選択されている場合は MIME スタッフを定義します。

これら 4 つのアプローチにはそれぞれ長所と短所があり、個人的には #3 を選択します。

于 2012-08-05T14:10:08.533 に答える
1

設定Advertise="no"すれば、書いたコードが使えるはずです。オプションのファイル関連付けに別のコンポーネントを使用して、数年前にここに投稿した例を次に示します。

<Component ....>
    <ProgId Id="AcmeFoobar.Document" hDescription="ACME XYZ Document">
        <Extension Id="pdf" ContentType="application/xyz">
            <Verb Id="open" Command="Open" TargetFile="[APPLICATIONFOLDER]AcmeFoobar.exe" Argument="%1" />
        </Extension>
    </ProgId>

    <Condition><![CDATA[DEFAULTVIEWER=1]]></Condition>
</Component>
于 2012-08-09T00:16:48.230 に答える
0

自分に合った解決策を見つけました。私が抱えていた問題は、拡張とEXEとの関連性に条件があったことでした。拡張機能が関連付けられていない場合、インストールするにはexeコンポーネントが必要でしたが、progidは必要でした。問題は、コンポーネントに条件を付けても、ProGIDは作成されないが、EXEもインストールされなかったことでした。私が見つけた解決策は、2つのCreate 2つのコンポーネントでした。1つは状態、もう1つは相互に排他的な状態を持つものです。これは基本的に、クリストファーペインターズポストのオプション2です。

下記参照:

<Component Id="My.exe" Guid="{D9CF6FDD-1234-4E90-85A1-3BF1F912C1E3}">
   <Condition>NOT FILES_ASSOCIATIONS_ABC</Condition>
    <File Id="My.exe.without_assoc" Name="My.exe" KeyPath="yes" Vital="yes" Compressed="yes" DiskId="1" Source=".\SourceDir\My.exe" />
  </Component>
  <Component Id="My.exe_assoc" Guid="{07F96643-5D74-1234-9DAE-CDEB5AC2D11E}">
    <File Id="My.exe.with_assoc" Name="My.exe" KeyPath="yes" Vital="yes" Compressed="yes" DiskId="1" Source=".\SourceDir\My.exe" />
    <Condition>FILES_ASSOCIATIONS_ABC</Condition>
    <ProgId Id="My.Document" Description="My exe" Icon="MyIcon" Advertise="yes">
      <Extension Id="abc">
        <Verb Id="open" Command="My Exe" Argument="&quot;%1&quot;" />
        <MIME Advertise="yes" ContentType="application/abc" Default="yes" />
      </Extension>
    </ProgId>
  </Component>
于 2014-11-05T21:10:53.850 に答える