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


81

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

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

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

実用的な例としてサンプルコードを投稿してください。

回答:


113

私自身の質問に答えるのが悪いエチケットならごめんなさい。

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

私はセットパッケージ要素の「perMachine」にInstallScope属性を。これにより、ALLUSERSプロパティが1に設定されます。ProgramMenuFolderDesktopFolderの値は、AllUsersプロファイルに解決されます。

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>

あなたの答えの詳細で本当に素晴らしい仕事。私はWiXのドキュメントとサンプルを調べてきたので、これは非常に役に立ちました。ありがとう!
デイブ

7
素晴らしい答え。ただし、別のコンポーネントにデスクトップショートカットがあるとします(条件付きでインストールするため)。IIUCのようなショートカットはアドバタイズできません。DISABLEADVTSHORTCUTSを使用してもAdvertise = "yes"を追加しようとすると、エラーCNDL0035が発生します。HKMUレジストリキーを使用してこのようなショートカットを作成する方法を確認できますか?
marcin 2011年

9
あなたが良い解決策を見つけたなら、あなた自身の質問に答えることは決して悪いエチケットではありません、そして私はあなたがしたことを非常に感謝しています-そして起動するための優れた答えを持っています。+1!
fzwo 2012

アイコンを実行可能ファイルに参照しないでください。アイコンは特別なディレクトリ(Windows \ Installer \ {GUID})にコピーされ、ショートカットはこの場所のアイコンを使用するため(つまり、INSTALLDIRの実行可能ファイルからではない)、別のアイコンファイルを使用することをお勧めします。
Dmitry Azaraev 2015

どうもありがとうございます。私はこれのトラブルシューティングに何時間も費やしました。DISABLEADVTSHORTCUTSについての手がかりはありませんでした。
ジェイソンヒューズ

8

この投稿はかなり古いものですが、非常に役立つ情報が含まれており、まだアクティブに見えます。一般に、ショートカットにダミーのレジストリキーは必要ないことを指摘しておきます。AFAIKこれは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つのコンポーネントにまとめられることに注意してください。これが気になる場合は、ダミーのレジストリキーを使用します(非常によく説明されている受け入れられた自己回答のように)。


1
<Property Id = "DISABLEADVTSHORTCUTS" Value = "1" />をProduct要素に追加することを忘れないでください
sartoris 2017年

@sartorisこれを回答に追加する必要があります。それなしでは動作しません。
AlexZhukovskiy18年

2

見てくださいMSIからWiXの、パート10に-ショートカットアレックス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>

9
あなたの例では、キーパスとして「HKCU」を使用しています。1人のユーザーがアプリをインストールし、別のユーザーがアプリを削除した場合、レジストリキーは残ります。投稿された最初のリンクは、レジストリキーにHKCUを使用しています。2つ目は、ICE43およびICE57エラーを生成するキーパスとしてファイルを使用します。
mcdon 2010年

1
レジストリキー、はい。ただし、ショートカット自体ではありません:)
saschabeaumont 2010年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.