用C#實現註冊表的讀\寫是一件很容易的事情,在此不做詳細的講解。
用C#操作註冊表主要用到的兩個函數為(已經滲透到下面的執行個體程式中,註:要引入Microsoft.Win32命名空間):
1:讀取索引值-->Registry.LocalMachine.OpenSubKey(“..Key的路徑...”, true),這裡的第2個bool類型的參數含義為:標誌開啟的索引值是否可以更改(即:是否可以用SetValue()給鍵賦值),然後調用GetValue()方法就能把索引值讀取出來。
2:寫入索引值-->Registry.LocalMachine.CreateSubKey("..Key的路徑..."),然後調用SetValue()寫入索引值。
這裡主要講解一下32位程式和64位程式在64位平台上讀\寫註冊表的區別【註:32位程式是-->Build的Platform target為X86;64位程式-->Build的Platform target為X64;並且VS2010在預設的狀態下為X86編譯環境(即:32位)】
簡要複述一下理論基礎:微軟為了讓32位程式不做任何修改就能運行在64的作業系統上,添加了一個十分重要的WOW64子系統來實現這個功能,WOW64是Windows-32-on-Windows-64的簡稱,從總體上來說,WOW64是一套基於使用者模式的動態連結程式庫,它可以把32位應用程式的發出的命令翻譯成64位系統可以接受的格式,即:WOW 層處理諸如在 32 位和 64 位元模式之間切換處理器以及類比 32 位系統的事務。
32位與64位特點的兩個重要表現方面為:檔案系統與註冊表。
檔案系統:32位進程不能載入64位Dll,64位進程也不可以載入32位Dll。
註冊表:為了防止註冊表鍵衝突,64位機器註冊表資訊分成了兩個部分。一部分是專門給64位系統(即:64位程式)訪問的,另一部分是專門給32位系統(即:32位程式)訪問的,放在Wow6432Node下面。(Wow6432Node這個節 點存在於HKEY_LOCAL_MACHINE和HKEY_CURRENT_USER下面)
既然知道了註冊表資訊分成了兩部分,那麼就可以想到:用32位程式和64位程式去操作註冊表的時候會操作不同位置的註冊表資訊。下面例子可以充分證明這種說法。
1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5 using Microsoft.Win32;
6
7 namespace OperateRegistrationTable
8 {
9 class Programe
10 {
11 static void Main(string[] args)
12 {
13 OperatingRegistryKey();
14 }
15
16 public static void OperatingRegistryKey()
17 {
18 string keyValue = string.Empty;
19 try
20 {
21 //向註冊表中寫資訊
22 using (RegistryKey key = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\EricSun\MyTestKey", true))
23 {
24 if (key == null)
25 {
26 using (RegistryKey myKey = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\EricSun\MyTestKey"))
27 {
28 myKey.SetValue("MyKeyName", "Hello EricSun." + DateTime.Now.ToString());
29 }
30 }
31 else
32 {
33 key.SetValue("MyKeyName", "Hello EricSun." + DateTime.Now.ToString());
34 }
35 }
36
37 //讀取註冊表資訊
38 using (RegistryKey currentKey = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\EricSun\MyTestKey", false))
39 {
40 if (currentKey == null)
41 {
42 Console.WriteLine("Hello EricSun, The Key you tried to open doesn't exist.");
43 }
44 else
45 {
46 keyValue = currentKey.GetValue("MyKeyName").ToString();
47 Console.WriteLine("The Key Value is: {0}", keyValue);
48 }
49 }
50 }
51 catch (Exception ex)
52 { }
53 }
54 }
55 }
56
將此段程式在X86(32位)平台下編譯、運行,會發現在註冊表的WOW6432Node節點下建立了子鍵:EricSun\MyTestKey,並且填充了鍵MyKeyName的值(用時間加以區分其值),而在SoftWare的第一層子節點中並沒有發現此EricSun。可以確定32位程式是操作註冊表資訊是放在WOW6432Node節點下的
若我們對這段程式不做任何修改,在X64(或Any Cpu)的平台下編譯、啟動並執行話,會發現在註冊表的SoftWare節點的第一層子節點中建立出了EricSun節點(並在此節點下建立相應的註冊表資訊),然後我們用同樣的程式去讀註冊表的時候也會發現他們讀取的地方不同(以程式中的時間資訊加以區分)
總結:X64,(或者Any Cpu) Platform下的程式會操作64位機器存放註冊表位置的註冊表資訊,X86 Platform下的程式會操作32位機器存放註冊表位置的註冊表資訊(即:WOW6432Node節點下的註冊表資訊)
若想知道用32位程式如何操作64機器的註冊表資訊,請關注我的下一篇文章: http://www.cnblogs.com/mingmingruyuedlut/archive/2011/01/21/1941225.html