http://cml.s10.xrea.com/ej/WiX/wi_etc.htm
メジャーアップグレードは、アプリケーションが ユーザーごとにインストールされていれば ユーザーごと、マシンごとでインストールされていればマシンごと、でしか適用できない。
これはなぜでしょうか?
Windowsインストーラーでは、同じアプリケーションは単一のUpgradeCode
を使い、(メジャー)バージョン毎に、Product
のId
を変更します。
前のバージョンがインストールされているか探すときには、UpgradeCode
をキーにして関連するProduct
のId
を検索します。
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
のアナグラムになっています。
その値はBF7EDB93A00F2FF4EA4A4430DA20D2B6
です。
これはProduct
のId
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_USER
はHKEY_USERS\S-1-5-21-2067597918-3928457008-2442526749-1001\
のショートカットなのかもしれません。
マシンごと
WiXファイルに次の要素を追加するとマシンごとのインストールになります。
<Property Id="ALLUSERS" Value="1" />
このファイルを元にmsiファイルを作りインストールします。
レジストリエディタで9FD37813
を検索すると次のキーが見つかります。
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>