2009-12-10 39 views
32

Tôi đã viết trình cài đặt WiX hoạt động hoàn hảo với Windows XP, nhưng khi cài đặt vào hộp Windows 7, tôi gặp sự cố với các mục đăng ký. Tôi cần phải thêm một mục nhập HKLM cũng như mục đăng ký cho chương trình để hiển thị trong trình đơn bắt đầu. Đây là mã tôi đang sử dụng cho cả hai loại mục nhập:WiX sẽ không thêm cài đặt đăng ký HKLM trong Windows 7 cài đặt

<!-- 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> 

Làm cách nào để khắc phục sự cố này?

Lưu ý phụ, quyền đăng ký giống nhau trên Windows   XP và Windows   7 máy tính.

+2

Tôi có thể tìm thấy nơi các mục nhập Registry đang diễn ra. Họ đang thực sự được đặt dưới Wow6432Node. Có cách nào để đặt nó dưới Khóa đăng ký phần mềm thông thường thay vì Software \ Wow6432Node không? –

Trả lời

31

Tôi đã tìm ra lý do tại sao điều này xảy ra.

Với trình cài đặt WiX đang được biên dịch trên nền tảng x86, Windows 7 đã chọn trình cài đặt 32 bit với các khóa đăng ký 32 bit. Windows   7 64-bit xử lý các mục đăng ký 32 bit bằng cách thực hiện những gì tôi thấy xảy ra.

Chương trình vẫn được đăng ký; nó không nằm trong phần 64-bit của sổ đăng ký. Biên dịch nó dưới một nền tảng x64 trong khi thực hiện các thay đổi cần thiết để làm cho nó cho một hệ thống 64-bit (ProgramFileFolder trở thành ProgramFiles64Folder, vv), và nó sẽ đặt mọi thứ vào đúng nơi.

+3

Có thể đáng chú ý là bạn tìm thấy mục nhập trong HKLM \ Software \ Wow6432Node \ [var.Manufacturer] \ [var.ProductName] – anhoppe

5

Có một số khác biệt về cách Windows 7 xử lý các khóa đăng ký nhất định. Registry phản ánh đã được gỡ bỏ bắt đầu với Windows   7. Tôi không chắc chắn nếu điều này đóng vào những gì bạn đang thấy ở đây, nhưng hãy kiểm tra this link để biết thêm về điều đó.

Ngoài ra, nếu bạn đang làm việc với phiên bản Windows 7 64 bit, bạn có thể tìm hiểu một số chi tiết cụ thể bằng cách tham khảo MSDN 64-bit Windows Programming Guide.

Hơn nữa, nếu bạn cần có các khóa đăng ký khác nhau được cài đặt vào các vị trí khác nhau dựa trên hương vị Windows (XP, Vista, 7, v.v.) thì this Stack Overflow question cũng có câu trả lời cho bạn.

+0

Điều này khá hữu ích và giúp tôi hiểu rõ hơn về sự thay đổi từ 32 đến 64 bit. –

17

Cảm ơn bạn đã giải quyết cơ bản cái này cho tôi!

Tôi chỉ muốn thêm rằng bạn không nhất thiết phải thay đổi mọi thứ thành x64 để làm việc này, chỉ thành phần được đề cập cần được đánh dấu là 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> 

Lưu ý Win64 = "yes", đó là tất cả những gì cần thiết để viết vào vùng 64-bit của registry. Các điều kiện VersionNT64 là có để thành phần này sẽ chỉ được cài đặt trên một hệ thống x64.

Trong trường hợp của tôi, điều này cho phép cảnh báo ICE80 vì tôi muốn cài đặt thành phần 64 bit trong ProgramFilesFolder 32 bit. Tôi rất vui khi bỏ qua những điều này vì ứng dụng chính của tôi không phải là x64, chỉ có phần mở rộng của trình bao là, và tôi không muốn đặt phần mở rộng của trình bao trong thư mục đặc biệt của nó.

+0

Tôi làm điều này, nhưng về cơ bản bạn đặt cài đặt đăng ký hai lần - một lần với win64 = yes và điều kiện VersionNT64 và khác không có và KHÔNG VersionNT64 - để tránh gõ hai lần bạn có thể sử dụng tệp bao gồm và sau đó chỉ cần bao gồm cùng một đoạn hai lần - và nếu cảnh báo ICE80 đang làm phiền bạn, bạn có thể chặn chúng trong các trang thuộc tính của dự án. – BrainSlugs83

Các vấn đề liên quan