2012-11-10 29 views
2

我已經檢查了一些其他答案,但據我所知,這是一個與我得到的命中不同的問題。Regedit顯示沒有使用GetSubKeyNames()列出的鍵

當我打開註冊表編輯器,我可以看到一組按鍵,但是當我使用例如爲:

Registry.LocalMachine.OpenSubKey(@"SOFTWARE").GetSubKeyNames() 

他們中的一些缺失列出他們從我的程序。我認爲這可能與訪問權限有關,所以我也檢查了.CurrentUser。那裏可以體驗到同樣的行爲。一些子鍵只是沒有列出。

我錯過了什麼?

回答

3

是你的OS X64嗎?如果是這種情況,對於「LocalMachine \ Software」,有兩個不同的節點:x64應用程序爲Normal,x86應用程序爲Wow6432Node。

一個示例應用程序來演示上述。

using System; 
using Microsoft.Win32; 

namespace ConsoleApplication1 
{ 
    internal class Program 
    { 
    public static void Main() 
    { 
     String[] values = Registry.LocalMachine.OpenSubKey(@"SOFTWARE").GetSubKeyNames(); 
     foreach (String value in values) 
       Console.WriteLine(value); 
    } 
    } 
} 

這是我的機器上的代碼的輸出時,控制檯應用程序內置在86:

的Adobe
AGEIA科技
酒精軟
蘋果電腦公司
蘋果Inc.
Aureal
Avira
Azureus
BazisSoft
C07ft5Y
佳能
思傑
...

這是我的機器上輸出時,控制檯應用程序內置在64:

的7-Zip
AGEIA技術
Apple Computer,Inc.
Apple Inc.
個ATI技術
佳能

客戶
...

正如你看到的,輸出變化基礎上,應用程序是否是x86或x64很多。

編輯: A similar question之前被問到StackOverflow。

+0

嗯...我可能誤會了,那麼 - 它**可能**可能是重複的。不過,我不清楚如何處理它。我不知道我的程序將運行在什麼系統上,我需要檢查某個位置的密鑰值(例如'software/windows/hazaa')。實際的路徑,我只能在我的電腦上查看,**希望**在其他機器上是一樣的。建議? –

+0

另外,當應用程序列在**子路徑中時,這意味着什麼!?那麼是48位呢? (32和64的平均值是48,哈哈...) –

+0

@KonradViltersten如何檢查此註冊表項>通過InstallShield或類似的安裝程序或C#控制檯應用程序?如果其InstallShield(或非託管應用程序)可以使用某些關鍵字訪問32位和64位註冊表項。如果它的C#控制檯應用程序在x86中構建,它將始終創建並訪問32位註冊表。如果在AnyCPU中,它將訪問32位機器中的32位和64位機器中的64位。如果註冊表項由一個應用程序(例如32位)創建,並且您需要從AnyCPU應用程序檢查它,問題纔會出現。 –