使用.netFx4.0提供的方法解决32位程序访问64位系统的64位注册表
?
我們知道目標(biāo)平臺(tái)是32位的程序運(yùn)行在64位的系統(tǒng)上,去訪問部分注冊(cè)表的時(shí)候系統(tǒng)自動(dòng)重定向到win32node節(jié)點(diǎn)對(duì)應(yīng)的項(xiàng)去了。但是做過安裝程序開發(fā)人員可能遇到過“需要去掉重定向”的問題,即直接訪問64位程序的注冊(cè)表。
網(wǎng)上有很多winAPI的方法,關(guān)閉注冊(cè)表的重定向稍微復(fù)雜。(關(guān)閉文件系統(tǒng)的重定向稍微簡單些,搬過來就可以用;關(guān)閉注冊(cè)表的重定向我現(xiàn)在沒看懂。)
我這里提供的方法不需要關(guān)閉重定向,也不需要用winAPI,操作起來方便了許多。具體如下:
? 第一個(gè)方法是獲得根節(jié)點(diǎn)的句柄,常數(shù)是固定的。
?
static IntPtr GetHiveHandle(RegistryHive hive){IntPtr preexistingHandle = IntPtr.Zero;IntPtr HKEY_CLASSES_ROOT = new IntPtr(-2147483648);IntPtr HKEY_CURRENT_USER = new IntPtr(-2147483647);IntPtr HKEY_LOCAL_MACHINE = new IntPtr(-2147483646);IntPtr HKEY_USERS = new IntPtr(-2147483645);IntPtr HKEY_PERFORMANCE_DATA = new IntPtr(-2147483644);IntPtr HKEY_CURRENT_CONFIG = new IntPtr(-2147483643);IntPtr HKEY_DYN_DATA = new IntPtr(-2147483642);switch (hive){case RegistryHive.ClassesRoot: preexistingHandle = HKEY_CLASSES_ROOT; break;case RegistryHive.CurrentUser: preexistingHandle = HKEY_CURRENT_USER; break;case RegistryHive.LocalMachine: preexistingHandle = HKEY_LOCAL_MACHINE; break;case RegistryHive.Users: preexistingHandle = HKEY_USERS; break;case RegistryHive.PerformanceData: preexistingHandle = HKEY_PERFORMANCE_DATA; break;case RegistryHive.CurrentConfig: preexistingHandle = HKEY_CURRENT_CONFIG; break;case RegistryHive.DynData: preexistingHandle = HKEY_DYN_DATA; break;}return preexistingHandle;}/// <summary>/// 用于32位程序訪問64位注冊(cè)表/// </summary>/// <param name="hive">根級(jí)別的名稱</param>/// <param name="keyName">不包括根級(jí)別的名稱</param>/// <param name="valueName">項(xiàng)名稱</param>/// <param name="view">注冊(cè)表視圖</param>/// <returns>值</returns>static object GetValueWithRegView(RegistryHive hive, string keyName, string valueName, RegistryView view){SafeRegistryHandle handle = new SafeRegistryHandle(GetHiveHandle(hive), true);//獲得根節(jié)點(diǎn)的安全句柄 RegistryKey subkey = RegistryKey.FromHandle(handle, view).OpenSubKey(keyName);//獲得要訪問的鍵 RegistryKey key = RegistryKey.FromHandle(subkey.Handle, view);//根據(jù)鍵的句柄和視圖獲得要訪問的鍵return key.GetValue(valueName);//獲得鍵下指定項(xiàng)的值 }/// <summary>/// 用于32位的程序設(shè)置64位的注冊(cè)表/// </summary>/// <param name="hive">根級(jí)別的名稱</param>/// <param name="keyName">不包括根級(jí)別的名稱</param>/// <param name="valueName">項(xiàng)名稱</param>/// <param name="value">值</param>/// <param name="kind">值類型</param>/// <param name="view">注冊(cè)表視圖</param>static void SetValueWithRegView(RegistryHive hive, string keyName, string valueName, object value, RegistryValueKind kind, RegistryView view){SafeRegistryHandle handle = new SafeRegistryHandle(GetHiveHandle(hive), true);RegistryKey subkey = RegistryKey.FromHandle(handle, view).OpenSubKey(keyName, true);//需要寫的權(quán)限,這里的true是關(guān)鍵。0227更新 RegistryKey key = RegistryKey.FromHandle(subkey.Handle, view);key.SetValue(valueName, value, kind);}???????使用這些方法需要引入Microsoft.Win32.SafeHandles;Microsoft.Win32;system;這三個(gè)命名空間。方法只提供了主干,沒有異常處理。望大家及時(shí)交流實(shí)際使用情況,不足之處請(qǐng)及時(shí)指出。
關(guān)于winAPI的方法可以訪問http://home.cnblogs.com/u/xuguilin/相應(yīng)的文章,同時(shí)也感謝xuguilin對(duì)我的指導(dǎo)。據(jù)介紹dotNet框架可能需要4.0版本以上
總結(jié)
以上是生活随笔為你收集整理的使用.netFx4.0提供的方法解决32位程序访问64位系统的64位注册表的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 周公解梦梦到葬礼是什么意思
- 下一篇: wndows系统命令总结