2010-02-04 37 views
13

Tôi có một cài đặt Visual Studio được tạo ra một số khóa registry:Tạo 64 bit khóa registry (không WOW64) từ một ứng dụng 32 bit

HKEY_LOCAL_MACHINE\SOFTWARE\MyApp 

nhưng các khóa registry nó được tạo ra sẽ được tự động xuất hiện dưới Wow6432Node :

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp 

Làm cách nào để bỏ qua Wow6432Node khi tạo khóa đăng ký trong mã C# của tôi đang được thực thi bởi msi?

+0

Tôi đoán, vì ứng dụng của bạn là 32 bit nên Windows đảm bảo rằng các thay đổi nằm trong 'Wow6432Node'. Để có được nó ra khỏi nút đó và đặt các mục trong đường dẫn bình thường, ứng dụng của bạn phải là 64-bit. – legends2k

Trả lời

21

Chỉ cần FYI, .NET 4.0 hỗ trợ nguyên bản này. Ví dụ:

RegistryBase = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64); 

Sau đó bạn có thể sử dụng RegistryBase biến để truy cập bất cứ điều gì trong giao diện 64-bit của HKLM. Ngược lại, Registry32 sẽ cho phép ứng dụng 64 bit truy cập chế độ xem 32 bit của sổ đăng ký.

+1

câu trả lời hay. Ngắn gọn và đúng trọng tâm. – Simon

1

Hãy xem http://www.pinvoke.net/default.aspx/advapi32/regopenkeyex.html. Bạn sẽ cần sử dụng trình chuyển hướng đăng ký và chuyển giá trị thích hợp cho mặt nạ truy cập. Thật không may bạn sẽ cần pInvoke.

+0

Oh tuyệt vời. Có bất kỳ NET API tốt đẹp xung quanh một người nào đó đã viết để bọc các cuộc gọi pinvoke và làm cho nó không phải là khủng khiếp như vậy? –

+0

Tôi sẽ không nói nó thật khủng khiếp. Một chút bất tiện có lẽ. Chỉ cần thêm DllImports và xác định KEY_WOW64_64KEY. Một ví dụ ngắn gọn hơn (để xóa) có thể được tìm thấy trên http://geekswithblogs.net/derekf/archive/2007/06/26/113485.aspx. – nithins

1

Kể từ khi có rất ít tài liệu về OpenBaseKey, tôi sẽ mở rộng về câu trả lời shifuimam và cung cấp một giải pháp cho OP:

Private Sub Foo() 
    Dim myAppIs64Bit = Environment.Is64BitProcess 
    Dim baseKey As RegistryKey 
    If (myAppIs64Bit) Then 
     baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry64) 
    Else 
     baseKey = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, RegistryView.Registry32) 
    End If 
    Dim myAppKey As RegistryKey = baseKey.OpenSubKey("SOFTWARE\MyApp") 
End Sub 

Nếu ứng dụng 32-bit, myAppKey điểm để HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\MyApp. Nếu 64 bit, nó trỏ đến HKEY_LOCAL_MACHINE\SOFTWARE\MyApp.

Lợi thế của OpenBaseKey là nó loại bỏ sự cần thiết phải tham chiếu Wow6432 trong mã của bạn.

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