32

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>

この問題を解決するにはどうすればよいですか?

ちなみに、レジストリのアクセス許可は、Windows XP コンピューターと Windows 7 コンピューターで同じです。

4

3 に答える 3

33

なぜこれが起こっているのかを理解しました。

WiX インストーラーが x86 プラットフォームでコンパイルされているため、Windows 7 は 32 ビット レジストリ キーを使用する 32 ビット インストーラーとしてそれを選択しました。Windows 7 64 ビットは、32 ビットのレジストリ エントリを、私が見たとおりに処理します。

プログラムはまだ登録されていました。レジストリの 64 ビット部分にありませんでした。64ビットシステム用に必要な変更を加えながらx64プラットフォームでコンパイルすると(ProgramFileFolderがProgramFiles64Folderになるなど)、適切な場所に配置されます。

于 2009-12-10T19:28:35.360 に答える
19

基本的にこれを解決してくれてありがとう!

これを機能させるために、必ずしもすべてを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 = "yes"に注意してください。これは、レジストリの64ビット領域に書き込むために必要なすべてです。VersionNT64条件が存在するため、このコンポーネントはx64システムにのみインストールされます。

私の場合、32ビットのProgramFilesFolderに64ビットのコンポーネントをインストールしたいので、これによりICE80の警告が表示されます。私のメインアプリケーションはx64ではなく、シェル拡張機能のみであり、シェル拡張機能を独自の特別なフォルダーに配置したくないため、これらを無視できます。

于 2010-04-05T07:33:31.267 に答える
5

Windows 7 が特定のレジストリ キーを処理する方法には、いくつかの違いがあります。レジストリ リフレクションは、Windows 7 以降で削除されました。これがここに表示されている内容に影響するかどうかはわかりませんが、詳細についてはこのリンクを確認してください。

また、Windows 7 の 64 ビット バージョンを使用している場合は、 MSDN の 64 ビット Windows プログラミング ガイドを参照して、詳細を掘り下げることができる場合があります。

さらに、Windows フレーバー (XP、Vista、7 など) に基づいて異なる場所に異なるレジストリ キーをインストールする必要がある場合は、このスタック オーバーフローの質問にも回答があります。

于 2009-12-10T16:51:17.033 に答える