@ledsun blog

Hのキーがhellで、Sのキーがslaveだ、と彼は思った。そしてYのキーがyouだ。

WiXのメジャーアップグレードは、アプリケーションが ユーザーごとにインストールされていれば ユーザーごと、マシンごとでインストールされていればマシンごと、でしか適用できない

http://cml.s10.xrea.com/ej/WiX/wi_etc.htm

メジャーアップグレードは、アプリケーションが ユーザーごとにインストールされていれば ユーザーごと、マシンごとでインストールされていればマシンごと、でしか適用できない。

これはなぜでしょうか? Windowsインストーラーでは、同じアプリケーションは単一のUpgradeCodeを使い、(メジャー)バージョン毎に、ProductIdを変更します。 前のバージョンがインストールされているか探すときには、UpgradeCodeをキーにして関連するProductIdを検索します。

UpgradeCodeレジストリに保存されています。 「ユーザーごと」と「マシンごと」では、保存するレジストリキーが違います。 つまり、「ユーザーごと」と「マシンごと」では、探すレジストリキーが違うので前のバージョンは見つかりません。

レジストリキー

実際に保存されるレジストリキーを確認してみましょう。

ユーザーごと

WiX チュートリアル 日本語訳 Lesson 1 始めよう / 3. 使用に供する のサンプルに次のようにGUIDを設定します。

<Product Name='ほげ 1.0'
         Id='{39BDE7FB-F00A-4FF2-AEA4-4403AD022D6B}'
         UpgradeCode='{31873DF9-BBA1-4105-ADF7-49E667567DD6}'
         Language='1041' Codepage='932'
         Version='1.0.0' Manufacturer='ぴよソフト'>

このファイルを元にmsiファイルを作りインストールします。 UpgradeCodeレジストリに保存されているのが確認できます。 ただし、そのままの形式ではなくアナグラム(?)になっています。

レジストリエディタでUpgradeCodeの最初のブロック31873DF9を逆順にした、9FD37813を検索すると次のキーが見つかります。 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Installer\UpgradeCodes\9FD378131ABB5014DA7F946E7665D76D

9FD378131ABB5014DA7F946E7665D76Dの部分がUpgradeCodeアナグラムになっています。

f:id:ledsun:20211215183741p:plain
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Installer\UpgradeCodes\9FD378131ABB5014DA7F946E7665D76Dの値

その値はBF7EDB93A00F2FF4EA4A4430DA20D2B6です。 これはProductId 39BDE7FB-F00A-4FF2-AEA4-4403AD022D6Bアナグラムです。

検索を続けると次のキーも見つかります。

  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UpgradeCodes\9FD378131ABB5014DA7F946E7665D76D
  • HKEY_USERS\S-1-5-21-2067597918-3928457008-2442526749-1001\SOFTWARE\Microsoft\Installer\UpgradeCodes\9FD378131ABB5014DA7F946E7665D76D

3つあるキーの役割がどう違うのかはわかりません。 HKEY_CURRENT_USERHKEY_USERS\S-1-5-21-2067597918-3928457008-2442526749-1001\のショートカットなのかもしれません。

マシンごと

WiXファイルに次の要素を追加するとマシンごとのインストールになります。

<Property Id="ALLUSERS" Value="1" />

このファイルを元にmsiファイルを作りインストールします。 レジストリエディタで9FD37813を検索すると次のキーが見つかります。 HKEY_CLASSES_ROOT\Installer\UpgradeCodes\9FD378131ABB5014DA7F946E7665D76D

f:id:ledsun:20211215195531p:plain
HKEY_CLASSES_ROOT\Installer\UpgradeCodes\9FD378131ABB5014DA7F946E7665D76Dの値

値はBF7EDB93A00F2FF4EA4A4430DA20D2B6で一緒です。

検索を続けると次のキーも見つかります。

  • HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\UpgradeCodes\9FD378131ABB5014DA7F946E7665D76D

なぜ、ユーザー毎だとHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersionレジストリキーを追加し、マシンごとだとHKEY_LOCAL_MACHINE\SOFTWARE\Classesレジストリキーを追加するのかはわかりません。同一でもよさそうな気はしますが、何か理由があるのでしょう。

WiXファイル

参考までにWiXファイルの全文も置いておきます。

<?xml version='1.0' encoding='utf-8'?>
<Wix xmlns='http://schemas.microsoft.com/wix/2006/wi'>

<Product Name='ほげ 1.0'
          Id='{39BDE7FB-F00A-4FF2-AEA4-4403AD022D6B}'
          UpgradeCode='{31873DF9-BBA1-4105-ADF7-49E667567DD6}'
          Language='1041' Codepage='932'
          Version='1.0.0' Manufacturer='ぴよソフト'>

    <Package Id='*' Keywords='インストーラ'
             Description="ぴよソフト's ほげ 1.0 インストーラ"
             Comments='ほげはぴよソフトの登録商標です。'
             Manufacturer='ぴよソフト' InstallerVersion='100'
             Languages='1041' Compressed='yes' SummaryCodepage='932' />
    <Property Id="ALLUSERS" Value="1" />

    <Media Id='1' Cabinet='Sample.cab' EmbedCab='yes' DiskPrompt='CD-ROM 1枚目' />
    <Property Id='DiskPrompt' Value="ぴよソフト's ほげ 1.0 インストーラ [1]" />

    <Directory Id='TARGETDIR' Name='SourceDir'>
     <Directory Id='ProgramFilesFolder' Name='PFiles'>
        <Directory Id='Piyo' Name='Piyo'>
          <Directory Id='INSTALLDIR' Name='Hoge 1.0'>

            <Component Id='MainExecutable'
                       Guid='A3AAD3C9-C833-4D1B-939E-0D1C47A31D95'>
              <File Id='HogeEXE'
                    Name='HogeAppl10.exe' DiskId='1'
                    Source='HogeAppl10.exe' KeyPath='yes'>
                <Shortcut Id="startmenuHoge10" Directory="ProgramMenuDir"
                          Name="ほげ 1.0" WorkingDirectory='INSTALLDIR'
                          Icon="Hoge10.exe" IconIndex="0" Advertise="yes" />
                <Shortcut Id="desktopHoge10" Directory="DesktopFolder"
                          Name="ほげ 1.0" WorkingDirectory='INSTALLDIR'
                          Icon="Hoge10.exe" IconIndex="0" Advertise="yes" />
              </File>
            </Component>

            <Component Id='HelperLibrary'
                       Guid='508A742A-02D9-4EFB-96C8-392175FA2655'>
              <File Id='HelperDLL' Name='HogeHelper.dll' DiskId='1'
                    Source='HogeHelper.dll' KeyPath='yes' />
            </Component>

            <Component Id='Manual'
                       Guid='4C85C8E8-3557-4ECD-971D-27463E225D85'>
              <File Id='Manual' Name='Manual.pdf' DiskId='1'
                    Source='Manual.pdf' KeyPath='yes'>
                <Shortcut Id='startmenuManual' Directory='ProgramMenuDir'
                          Name='取扱説明書' Advertise='yes' />
              </File>
            </Component>
            
          </Directory>
        </Directory>
      </Directory>

      <Directory Id="ProgramMenuFolder" Name="Programs">
        <Directory Id="ProgramMenuDir" Name="ほげ 1.0">
          <Component Id="ProgramMenuDir"
                     Guid="B061CD08-398B-47D2-8BAC-B3DA45CCE0D5">
            <RemoveFolder Id='ProgramMenuDir' On='uninstall' />
            <RegistryValue Root='HKCU'
                           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="Hoge10.exe" SourceFile="HogeAppl10.exe" />

  </Product>
</Wix>