山东卓商网站建设公司,?a品定制网站开发,甘肃省建设信息平台,网站加产品分类原文:使用.netFx4.0提供的方法解决32位程序访问64位系统的64位注册表我们知道目标平台是32位的程序运行在64位的系统上#xff0c;去访问部分注册表的时候系统自动重定向到win32node节点对应的项去了。但是做过安装程序开发人员可能遇到过“需要去掉重定向”的问题#xff0c…原文:使用.netFx4.0提供的方法解决32位程序访问64位系统的64位注册表 我们知道目标平台是32位的程序运行在64位的系统上去访问部分注册表的时候系统自动重定向到win32node节点对应的项去了。但是做过安装程序开发人员可能遇到过“需要去掉重定向”的问题即直接访问64位程序的注册表。 网上有很多winAPI的方法关闭注册表的重定向稍微复杂。关闭文件系统的重定向稍微简单些搬过来就可以用关闭注册表的重定向我现在没看懂。 我这里提供的方法不需要关闭重定向也不需要用winAPI操作起来方便了许多。具体如下 第一个方法是获得根节点的句柄常数是固定的。 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位注册表/// /summary/// param namehive根级别的名称/param/// param namekeyName不包括根级别的名称/param/// param namevalueName项名称/param/// param nameview注册表视图/param/// returns值/returnsstatic object GetValueWithRegView(RegistryHive hive, string keyName, string valueName, RegistryView view){SafeRegistryHandle handle new SafeRegistryHandle(GetHiveHandle(hive), true);//获得根节点的安全句柄
RegistryKey subkey RegistryKey.FromHandle(handle, view).OpenSubKey(keyName);//获得要访问的键
RegistryKey key RegistryKey.FromHandle(subkey.Handle, view);//根据键的句柄和视图获得要访问的键return key.GetValue(valueName);//获得键下指定项的值}/// summary/// 用于32位的程序设置64位的注册表/// /summary/// param namehive根级别的名称/param/// param namekeyName不包括根级别的名称/param/// param namevalueName项名称/param/// param namevalue值/param/// param namekind值类型/param/// param nameview注册表视图/paramstatic 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);//需要写的权限,这里的true是关键。0227更新
RegistryKey key RegistryKey.FromHandle(subkey.Handle, view);key.SetValue(valueName, value, kind);} 使用这些方法需要引入Microsoft.Win32.SafeHandles;Microsoft.Win32;system;这三个命名空间。方法只提供了主干没有异常处理。望大家及时交流实际使用情况不足之处请及时指出。 关于winAPI的方法可以访问http://home.cnblogs.com/u/xuguilin/相应的文章同时也感谢xuguilin对我的指导。据介绍dotNet框架可能需要4.0版本以上