2010-05-29 30 views
6

Tôi có trình cài đặt ghi vào HKLM\Software\DroidExplorer\InstallPath. Trên bất kỳ máy x86 nào, nó chỉ ghi vào vị trí mong muốn và trên Windows   XP x64 và Windows   7 x64 nó cũng ghi vào vị trí mong đợi, thực tế là HKLM\Software\Wow6432Node\DroidExplorer\InstallPath.Tại sao trình cài đặt Wi-Fi x86 trên Windows Vista x64 không ghi khóa vào Wow6432Node trong sổ đăng ký?

Sau này trong khi cài đặt, bootstrapper của tôi, cũng là x86, cố gắng đọc giá trị. Trên tất cả các máy Windows x86, nó thành công, và trên Windows XP x64 và Windows 7 x64, nhưng Windows Vista x64 không thể định vị khóa. Nếu tôi nhìn vào sổ đăng ký, nó không thực sự ghi nó vào Wow6432Node trên Windows   Vista; nó viết nó vào Software\DroidExplorer\InstallPath.

Nếu tôi không yêu cầu trình cài đặt viết thư cho Wow6432Node, nó ghi giá trị lên Software\DroidExplorer\InstallPath, nhưng bootstrapper vẫn cố tìm trong Wow6432Node vì số registry reflection. Đây là trên tất cả các hệ thống x64.

Tại sao Windows   Vista x64 là người duy nhất tôi gặp sự cố này? Có cách nào để giái quyết vấn đề này không?

Tôi chỉ muốn thêm bản chỉnh sửa rằng thao tác này vẫn đang mở. Không có đề xuất nào dưới đây vẫn chưa giải quyết được vấn đề này.

+0

Bạn có 'Win64 =" no "' trên thẻ ''? Nếu không, hãy thử thiết lập nó. –

+1

thậm chí không cho phép tôi biên dịch nếu tôi thiết lập ... Tôi đã thực sự hy vọng nó là một cái gì đó dễ dàng. Lỗi tôi nhận được là: lỗi LGHT0204: ICE80: 32BitComponent InstallDirectoryRegister này sử dụng 64BitDirectory INSTALLDIR –

+0

Nếu bạn thay đổi thành phần thành 32 bit, bạn cũng phải thay đổi thư mục cài đặt thành 32 bit. Đó là ý nghĩa của thông báo lỗi. –

Trả lời

2

Thực tế là chuyển hướng đăng ký là không trên Windows Vista x64   là rất lạ bởi vì theo MSDN, Registry Redirector, Windows Vista   nên cũng bị ảnh hưởng bởi nó. Một bình luận trong câu trả lời khác, "Điều này không có tác dụng, khi tôi xây dựng phiên bản x64 của ứng dụng, cài đặt trong x64 PFiles, nó cho tôi biết rằng tôi đang sử dụng thư mục cài đặt 64 bit và không làm gì" t cho phép Win64 = no "để lại cho tôi một chút nhầm lẫn về loại MSI bạn đang xây dựng.

Chuyển hướng đăng ký sẽ chỉ ảnh hưởng đến các thành phần 32 bit trong MSI của bạn. Nếu nền tảng đích cho dự án WiX là x86, thì MSI kết quả là một MSI 32 bit và tất cả các thành phần sẽ bị ảnh hưởng bởi chuyển hướng đăng ký.

Mặt khác, nếu nền tảng đích của dự án WiX là x64 thì các thành phần duy nhất sẽ bị ảnh hưởng bởi chuyển hướng đăng ký sẽ là những thành phần được đánh dấu rõ ràng là Win64 = không. (Theo mặc định, WiX giả định rằng tất cả các thành phần là 64 bit nếu nền tảng đích của bạn là x64.)

Lưu ý rằng nếu thành phần cho mục nhập đăng ký của bạn được bao gồm trong thư mục ProgramFiles64 thì WiX sẽ giả định nó là 64 -bit thành phần, và nó sẽ không bị ảnh hưởng bởi chuyển hướng đăng ký. Đây là lý do WiX không cho phép bạn chỉ định Win64 = no trên thành phần đó.

Bạn nên xác minh rằng mọi thành phần chứa mục đăng ký mà bạn muốn được chuyển hướng được định cấu hình để sử dụng ProgramFiles (tệp 32 bit) vì đó là thư mục mẹ trong cả tệp x86 và x64 MSI của bạn.

1

Có thể bạn phải thay đổi mã của bootstrapper 32 bit của mình. Bạn nên kiểm tra xem ứng dụng có chạy dưới hệ điều hành 64 bit hay không, ví dụ như đối với hàm IsWow64Process (xem http://msdn.microsoft.com/en-us/library/ms684139.aspx). Nếu hệ điều hành là 64 bit thì bạn nên mở khóa với cờ KEY_QUERY_VALUE | KEY_WOW64_64KEY (hoặc các cờ khác kết hợp với KEY_WOW64_64KEY) trong RegOpenKeyEx.

Nếu bạn gặp sự cố với việc chuyển hướng tệp trong hệ điều hành 64 bit, bạn có thể gọi Wow64DisableWow64FsRedirection trong bootstrapper (xem http://msdn.microsoft.com/en-us/library/aa365743.aspx).

CẬP NHẬT dựa trên nhận xét: Nếu bạn muốn khóa Software\WOW6432Node\DroidExplorer\InstallPath sẽ được tạo bởi MSI (ví dụ: bạn cài đặt ứng dụng 32 bit), bạn có thể thực hiện việc này trực tiếp. Nguyên nhân bạn nên cài đặt Windows đang chạy trên hệ điều hành 64-bit với điều kiện trong bảng thành phần sử dụng tài sản VersionNT64 (hoặc Msix64 hoặc Intel64 nếu cần).

CẬP NHẬT 2 xem xét sử dụng các cờ msidbComponentAttributesDisableRegistryReflection hoặc/và msidbComponentAttributes64bit cho các thành phần có khóa đăng ký mà bạn tạo. Ngoài ra, hãy xác minh giá trị bạn sử dụng trong các thuộc tính Template Summary (x64;1033 hoặc Intel;1033) và Page Count Summary thuộc tính (phải từ 200 trở lên) trong luồng thông tin tóm tắt.

+0

bootstrapper không có vấn đề, nó đang tìm kiếm trong hive registry đúng. của nó msi đó là viết giá trị cho hive sai. trên win7 64bit, các msi 32bit, một số cách viết cho hive 64bit, không phải là mong đợi WOW6432Node như nó nên. –

+0

i có nghĩa là vista 64bit trong bình luận của tôi, không phải win7, nhưng dù sao đi nữa. Tôi biết tôi có thể làm điều đó bằng tay bằng cách buộc WOW6432Node, nhưng tôi không cần phải ép buộc nó, vì nó nên viết cho có bất kỳ cách nào, kể từ khi cài đặt là 32bit.tại sao tôi không phải ép buộc WOW6432Node trên Win7? –

+0

Xin lỗi, tôi không hiểu nhận xét của bạn. Bạn chỉ có thể định nghĩa hai thành phần một với khóa registry 'Software \ WOW6432Node \ DroidExplorer \ InstallPath' và một thành phần khác có khoá đăng ký' Software \ DroidExplorer \ InstallPath'. Đối với thành phần đầu tiên, bạn nên sử dụng điều kiện 'VersionNT64' và đối với điều kiện thứ hai là' NOT VersionNT64'. Thiết lập của bạn sẽ luôn tạo phiên bản 32 bit của khóa 'Software \ DroidExplorer \ InstallPath'. – Oleg

-1

Bạn phải đặt thành phần thành Win32, sử dụng tham số Win64="No". Nếu không, MSI sẽ sử dụng bất kỳ hệ thống nào được chạy trên mặc định (nghĩa là x64 trên hệ điều hành như vậy).

Vì vậy, ví dụ:

<Component Id="C__mycomponent" Guid="MYGUID" Win64="No"> 
    <RegistryKey Root="HKLM" Key="Software\DroidExplorer\InstallPath" Action="createAndRemoveOnUninstall" /> 
</Component> 
+0

Điều này không hoạt động, khi tôi xây dựng phiên bản x64 của ứng dụng, cài đặt trong x64 PFiles, nó nói với tôi rằng tôi đang sử dụng một thư mục cài đặt 64 bit và không cho phép Win64 = no –

+0

Chắc chắn, nếu bạn có một thành phần x64, thì toàn bộ msi là x64 và sẽ không cho phép các thành phần win32. Nó không thể (không gian lận) để có cả hai thành phần win32 và x64 trong một msi duy nhất. Xem tại đây để biết chi tiết: http://blogs.msdn.com/b/heaths/archive/2008/01/15/different-packages-are-required-for-different-processor-architectures.aspx – Stefan

+0

Bài đăng đó nói nó sẽ cho phép ghi vào cả hai phát ban 64 và 32 bit, nhưng đó là vấn đề tôi đang gặp phải, nó không ghi vào hive 32 bit nếu nó là 64 bit cài đặt. Tôi thậm chí còn cung cấp WOW6432Node trong đường dẫn đăng ký. –

0

Cách duy nhất để làm điều này là thông qua một hành động tùy chỉnh.

Bạn sẽ phải gọi RegOpenKeyEx và đặt 0x100 tham số REGSAM samDesired để buộc sử dụng đăng ký 64 bit. Xem RegOpenKeyEx here.

Bạn không thể sử dụng các lớp Đăng ký .NET chuẩn để thực hiện việc này. Bạn sẽ phải tự sử dụng P/Invoke nếu sử dụng ngôn ngữ .NET.

Bạn có thể nên tắt bằng cách cung cấp hai trình cài đặt, một cho 64 bit và một cho 32 bit. Đây là cách chúng tôi đã giải quyết vấn đề, vì nó ít phức tạp hơn nhiều.

+0

Tôi không muốn bắt buộc đăng ký 64 bit, tôi muốn sử dụng đăng ký 32 bit, bất kể phiên bản của hệ điều hành là gì. Tôi nói với nó rằng đường dẫn nằm trong WOW6432Node nhưng nó vẫn viết cho đường dẫn "non-WOW6432Node". –

+0

Bạn đang gây hiểu nhầm về cách hoạt động của WoW6432Node, bạn không thể chỉ định nó trong đường dẫn đến khóa đăng ký của mình. Nếu bạn đang chạy trong một quá trình 32 bit trên một máy 64 bit, sổ đăng ký sẽ tự động sử dụng đường dẫn này. Nếu bạn đang viết từ quá trình 64 bit trên máy 64 bit, nó sử dụng khóa tiêu chuẩn. Nếu bạn cần ghi vào phần 32 bit từ trình cài đặt 64 bit, hãy đặt khóa đăng ký trong thành phần riêng của nó và chỉ định Win64 = "không", MAKE SURE WoW6432Node KHÔNG ở trong đường dẫn của bạn. Nếu điều đó không hoạt động, bạn có thể phải biên dịch mọi thứ cho 32 bit. – jonathanpeppers

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