Windows XPで完全に動作するWiXインストーラーを作成しましたが、Windows 7ボックスにインストールすると、レジストリエントリで問題が発生します。スタートメニューに表示するプログラムのレジストリエントリだけでなく、HKLMエントリも追加する必要があります。両方のタイプのエントリに使用しているコードは次のとおりです。
<!-- Create the registry entries for the program -->
<DirectoryRef Id="TARGETDIR">
<Component Id="RegistryEntriesInst" Guid="...">
<RegistryKey Root="HKLM"
Key="Software\$(var.Manufacturer)\$(var.ProductName)"
Action="createAndRemoveOnUninstall">
<RegistryValue
Type="string"
Name="installed"
Value="true"
KeyPath="yes"/>
</RegistryKey>
</Component>
<Component Id="RegistryEntriesVer" Guid="...">
<RegistryKey Root="HKLM"
Key="Software\$(var.Manufacturer)\$(var.ProductName)"
Action="createAndRemoveOnUninstall">
<RegistryValue
Type="string"
Name="version"
Value="$(var.ProductVersion)"
KeyPath="yes"/>
</RegistryKey>
</Component>
</DirectoryRef>
<!-- To add shortcuts to the start menu to run and uninstall the program -->
<DirectoryRef Id="ApplicationProgramsFolder">
<Component Id="ApplicationShortcut" Guid="...">
<Shortcut Id="ApplicationStartMenuShortcut"
Name="$(var.ProductName)"
Description="..."
Target="[SERVERLOCATION]$(var.Project.TargetFileName)"
WorkingDirectory="SERVERLOCATION"/>
<Shortcut Id="UninstallProduct"
Name="Uninstall $(var.ProductName)"
Description="..."
Target="[System64Folder]msiexec.exe"
Arguments="/x [ProductCode]"/>
<RemoveFolder Id="SERVERLOCATION" On="uninstall"/>
<RegistryValue
Root="HKCU"
Key="Software\$(var.Manufacturer)\$(var.ProductName)"
Name="installed"
Type="integer"
Value="1"
KeyPath="yes"/>
</Component>
</DirectoryRef>
この問題を解決するにはどうすればよいですか?
ちなみに、レジストリのアクセス許可はWindowsXPとWindows7のコンピューターで同じです。
私はこれがなぜ起こっているのか理解しました。
WiXインストーラーがx86プラットフォームでコンパイルされているため、Windows7はそれを32ビットレジストリキーを持つ32ビットインストーラーとして採用しました。 Windows 7 64ビットは、私が見たとおりに実行することで、32ビットのレジストリエントリを処理します。
プログラムはまだ登録されていました。レジストリの64ビット部分にはありませんでした。 64ビットシステム用に必要な変更を加えながら(ProgramFileFolderがProgramFiles64Folderになるなど)、x64プラットフォームでコンパイルすると、適切な場所に配置されます。
基本的にこれを解決してくれてありがとう!
これが機能するために必ずしもすべてをx64に変更する必要はなく、問題のコンポーネントのみをx64としてマークする必要があることを付け加えたいと思います。
<Component Id="MyShellExtension64.dll" Guid="..." Win64="yes">
<Condition>VersionNT64</Condition>
<File
Name="MyShellExtension64.dll"
Source="MyShellExtension64.dll"
KeyPath="yes"/>
<RegistryValue
Root="HKLM" Key="SOFTWARE\Microsoft\Windows\CurrentVersion\Shell Extensions\Approved"
Name="{GUID}" Value="My Shell Extension" Type="string"/>
</Component>
注意してください Win64 = "はい"、レジストリの64ビット領域に書き込むために必要なのはこれだけです。 VersionNT64条件が存在するため、このコンポーネントはx64システムにのみインストールされます。
私の場合、32ビットのProgramFilesFolderに64ビットのコンポーネントをインストールしたいので、これによりICE80の警告が表示されます。私のメインアプリケーションはx64ではなく、シェル拡張機能のみであり、シェル拡張機能を独自の特別なフォルダーに配置したくないため、これらを無視してかまいません。
Windows7が特定のレジストリキーを処理する方法にはいくつかの違いがあります。レジストリリフレクションはWindows7から削除されました。これがここに表示されているものに反映されるかどうかはわかりませんが、詳細については このリンク を確認してください。
また、64ビットバージョンのWindows 7を使用している場合は、 MSDN 64ビットWindowsプログラミングガイド を参照して、いくつかの詳細を掘り下げることができる場合があります。
さらに、Windowsフレーバー(XP、Vista、7など)に基づいてさまざまな場所にさまざまなレジストリキーをインストールする必要がある場合は、 このスタックオーバーフローの質問 にも答えがあります。