web-dev-qa-db-ja.com

Wixはすべてのユーザー/マシンごとに非アドバタイズされたショートカットを作成します

WIXでは、allusersプロファイルに広告されていないショートカットをどのように作成しますか?これまでのところ、私は広告されたショートカットでこれを達成することができました。アドバタイズされていないショートカットの方が好きです。ショートカットのプロパティに移動して「ターゲットを見つける」を使用できるからです。

チュートリアルでは、ショートカットのキーパスにレジストリ値を使用しました。問題は、HKCUをルートとして使用していることです。 HKCUが使用され、別のユーザーがプログラムをアンインストールすると(すべてのユーザーにインストールされているため)、レジストリキーが残されます。 HKMUをルートとして使用すると、ICE57エラーが発生しますが、別のユーザーがプログラムをアンインストールすると、キーが削除されます。 HKMUは正しく動作するように見えますが(ユーザーごとまたはすべてのユーザーに対して)、HKCUを使用するように思われます。

アドバタイズされていないショートカットを作成しようとすると、ICE38、ICE43、ICE 57などのさまざまなICEエラーが発生します。これまでに見たほとんどの記事では、「アイスエラーを無視する」ことをお勧めします。 ICEエラーを作成せずに、アドバタイズされていないショートカットを作成する方法が必要です。

動作例のサンプルコードを投稿してください。

75
mcdon

自分の質問に答えるのが悪いエチケットの場合は申し訳ありません。

最近、 DISABLEADVTSHORTCUTSプロパティ に関する情報を見つけました。アドバタイズされたショートカットを使用してインストールを作成し、DISABLEADVTSHORTCUTSプロパティを1に設定して、アドバタイズされていないショートカットを作成しました。アドバタイズされたショートカットはファイルをキーパスとして使用できるため、これは ICE43エラー をバイパスします。 DISABLEADVTSHORTCUTSが設定されているため、Windowsインストーラーはこれらの公示されたショートカットを通常のショートカットに置き換えます。

Package Element's InstallScope属性を「perMachine」に設定します。これにより、ALLUSERSプロパティが1に設定されます。 ProgramMenuFolder および DesktopFolder の値は、すべてのユーザープロファイルに解決されます。

ProgramMenuFolderの下に作成されたフォルダーには、RemoveFolderおよびRegistryValue要素があります。私が見た例( ex1ex2 )は、RegistryValueのルートとしてHKCUを使用しています。このルートを [〜#〜] hkmu [〜#〜] に変更しました。これは、ALLUSERSの値に応じてHKCUまたはHKLMに解決されます。

つまり、DISABLEADVTSHORTCUTSを1に設定すると、アドバタイズされたショートカットはICEエラーを生成しませんが、インストール時にアドバタイズされていないショートカットに変換されます。ルートHKMUを持つRegistryValueは、非アドバタイズされたショートカットのキーパスでない限り、KeyPathに適しています。

<?xml version="1.0" encoding="utf-8"?>
<!-- This example is based on SampleFirst by Gábor DEÁK JAHN, Tramontána:
        http://www.tramontana.co.hu/wix/lesson1.php#1.3
    Original SampleFirst:
        http://www.tramontana.co.hu/wix/download.php?file=samples/samplefirst.Zip&type=application/Zip -->
<Wix xmlns="http://schemas.Microsoft.com/wix/2006/wi">
    <Product Name="Foobar 1.0" Id="YOURGUID-21F1-4026-ABD2-7CC7F8CE4D18" UpgradeCode="YOURGUID-AFA4-46C6-94AA-EEE3D104F903" Language="1033" Codepage="1252" Version="1.0.0" Manufacturer="Acme Ltd.">
        <Package Id="*" Keywords="Installer" Description="Acme's Foobar 1.0 Installer" Comments="Foobar is a registered trademark of Acme Ltd." Manufacturer="Acme Ltd." InstallerVersion="100" Languages="1033" Compressed="yes" SummaryCodepage="1252" InstallScope="perMachine" />
        <Media Id="1" Cabinet="Sample.cab" EmbedCab="yes" DiskPrompt="CD-ROM #1" />
        <Property Id="DiskPrompt" Value="Acme's Foobar 1.0 Installation [1]" />
        <Property Id="DISABLEADVTSHORTCUTS" Value="1" />
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder" Name="PFiles">
                <Directory Id="Acme" Name="Acme">
                    <Directory Id="INSTALLDIR" Name="Foobar 1.0">
                        <Component Id="MainExecutable" Guid="YOURGUID-3E4F-47A2-86F1-F3162E9C4798">
                            <File Id="FoobarEXE" Name="FoobarAppl10.exe" DiskId="1" Source="FoobarAppl10.exe" KeyPath="yes">
                                <Shortcut Id="startmenuFoobar10" Directory="ProgramMenuDir" Name="Foobar 1.0" WorkingDirectory="INSTALLDIR" Icon="Foobar10.exe" IconIndex="0" Advertise="yes" />
                                <Shortcut Id="desktopFoobar10" Directory="DesktopFolder" Name="Foobar 1.0" WorkingDirectory="INSTALLDIR" Icon="Foobar10.exe" IconIndex="0" Advertise="yes" />
                            </File>
                        </Component>
                        <Component Id="HelperLibrary" Guid="YOURGUID-C7DA-4C02-A2F0-A6E089FC0CF3">
                            <File Id="HelperDLL" Name="Helper.dll" DiskId="1" Source="Helper.dll" KeyPath="yes" />
                        </Component>
                        <Component Id="Manual" Guid="YOURGUID-FF92-4BF4-A322-819A3B2265A0">
                            <File Id="Manual" Name="Manual.pdf" DiskId="1" Source="Manual.pdf" KeyPath="yes">
                                <Shortcut Id="startmenuManual" Directory="ProgramMenuDir" Name="Instruction Manual" Advertise="yes" />
                            </File>
                        </Component>
                    </Directory>
                </Directory>
            </Directory>
            <Directory Id="ProgramMenuFolder" Name="Programs">
                <Directory Id="ProgramMenuDir" Name="Foobar 1.0">
                    <Component Id="ProgramMenuDir" Guid="YOURGUID-D1C2-4D76-BA46-C6FA79862E77">
                        <RemoveFolder Id="ProgramMenuDir" On="uninstall" />
                        <RegistryValue Root="HKMU" Key="Software\[Manufacturer]\[ProductName]" Type="string" Value="" KeyPath="yes" />
                    </Component>
                </Directory>
            </Directory>
            <Directory Id="DesktopFolder" Name="Desktop" />
        </Directory>
        <Feature Id="Complete" Level="1">
            <ComponentRef Id="MainExecutable" />
            <ComponentRef Id="HelperLibrary" />
            <ComponentRef Id="Manual" />
            <ComponentRef Id="ProgramMenuDir" />
        </Feature>
        <Icon Id="Foobar10.exe" SourceFile="FoobarAppl10.exe" />
    </Product>
</Wix>
106
mcdon

この投稿はかなり古いものですが、非常に有用な情報が含まれており、まだアクティブに見えます。一般的に、ショートカットにダミーのレジストリキーは必要ありません。私の知る限り、これはWiXのチュートリアルであり、MSIまたは認定要件ではありません。以下に、regキーを使用しない例を示します。

<Fragment Id="Folders">
  <Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="ProgramFilesFolder">
      <Directory Id="INSTALLFOLDER" Name="MyApp">
      </Directory>
    </Directory>
    <Directory Id="ProgramMenuFolder">
      <Directory Id="MyAppStartMenuDir" Name="MyApp"/>
    </Directory>
  </Directory>
</Fragment>
<Fragment Id="Components">
  <Component Id="MyAppComp" Directory="INSTALLFOLDER" ...>
    <!--The advertise flag below is to bypass ICE errors in WiX, the actual shortcut will not be advertises if those are disabled globally with DISABLEADVTSHORTCUTS-->
    <File ..." KeyPath="yes">
      <Shortcut Id="MyAppStartMenuLink" Directory="MyAppStartMenuDir" Advertise="yes" ... />
    </File>
    <RemoveFolder Id="StartMenuDirRemoved" Directory="MyAppStartMenuDir" On="uninstall" />
  </Component>
</Fragment>

これにより、ショートカットが実行可能ファイルとともに1つのコンポーネントに配置されることに注意してください。これが気になる場合は、ダミーのレジストリキーを使用します(非常によく説明されている受け入れられた自己回答のように)。

6
zzz

MSIからWiXへ、パート10-ショートカット Alex Shevchukをご覧ください。

または、Rob Menchingのブログ投稿 アンインストールショートカットの作成方法(およびすべてのICE検証に合格する方法)。

基本的にICE57はかなり迷惑です...しかし、ここに私がデスクトップショートカットに使用している(動作しているようです)コードがあります:)

<Component Id="DesktopShortcut" Directory="APPLICATIONFOLDER" Guid="*">
    <RegistryValue Id="RegShortcutDesktop" Root="HKCU" Key="SOFTWARE\My App\1.0\settings" Name="DesktopSC" Value="1" Type="integer" KeyPath="yes" />
    <Shortcut Id="desktopSc" Target="[APPLICATIONFOLDER]MyApp.exe" Directory="DesktopFolder" Name="My Applications" Icon="myapp.ico" IconIndex="0" WorkingDirectory="APPLICATIONFOLDER" Advertise="no"/>
    <RemoveFolder Id="RemoveShortcutFolder" On="uninstall" />
    <Condition>DT_SHORTCUT=1</Condition>
</Component>
2
saschabeaumont