32位程序如何访问64位的注册表
2017-04-12 10:31
423 查看
32位程序如何访问64位的注册表 64位OS中,从32位Nunit调用32位DLL中的方法运行,如何访问64位的注册表项? (也即关闭注册表转向功能。) 如读取HKEY_LOCAL_MACHINE/Software/Microsoft子项的value,而非 HKEY_LOCAL_MACHINE/Software/Wow6432Node/Microsoft子项的value。 我在网上,找到一些这方面的资料: http://www.cnblogs.com/FlyingBread/archive/2007/01/21/624291.aspx http://msdn2.microsoft.com/en-us/library/aa365744.aspx 然后试着编码,如下,运行,结果是失败,无法打开HKEY_LOCAL_MACHINE/Software/Microsoft/Updates: [Test] public void test() { bool update = false; IntPtr ptr = new IntPtr(1); Wow64DisableWow64FsRedirection(ref ptr); RegistryKey softKey = Registry.LocalMachine; RegistryKey updateKey = softKey.OpenSubKey(@ "Software/Microsoft/Updates "); // if the key is null if (updateKey != null) { update = true; } Wow64RevertWow64FsRedirection(ptr); Assert.IsTrue(update); } 可有高手来指教一下?本人因为分数太少,就只能给20分了,见谅!!! 用RegOpenKeyEx试试看。 许查了资料,解决了这个问题。核心代码如下 public string Get() { try { //the registry handle we get from regopenkeyex. UIntPtr pHKey = new UIntPtr(); //result string StringBuilder result = new StringBuilder(); //NOTE!!!!!!!!!!!!! This code should be improved uint resultSize = 1024; uint lpType = 0; //Disble redirection IntPtr oldWOW64State = new IntPtr(); if (Win32Encap.Win32Encap.Wow64DisableWow64FsRedirection(ref oldWOW64State)) { //get the key handle CrossWOW64RegVisitor.Win32Encap.Win32Encap.RegOpenKeyEx((UIntPtr)this.BaseRoot, this.KeyPath, 0, (int)this.SAM | (int)(SAM.KEY_QUERY_VALUE), ref pHKey); //Disable reflection Win32Encap.Win32Encap.RegDisableReflectionKey(pHKey); //Get value CrossWOW64RegVisitor.Win32Encap.Win32Encap.RegQueryValueEx(pHKey, this.ValueName, 0, out lpType, result, ref resultSize); //Enable reflection Win32Encap.Win32Encap.RegEnableReflectionKey(pHKey); } Win32Encap.Win32Encap.Wow64RevertWow64FsRedirection(oldWOW64State); return result.ToString(); } //if caught, there must some API not available, just return the normal value catch (Exception ex) { string fullKeyPath = this.BaseRoot.ToString() + "//" + this.KeyPath; return Registry.GetValue(fullKeyPath, this.ValueName, "").ToString(); } }
相关文章推荐
- 32位程序如何访问64位的注册表
- 32位程序如何使用ADO访问64位Oracle数据库
- 应对32位程序在64位系统上访问注册表和文件自动转向问题
- Tip - 注意:32位程序访问64位系统上的Windows注册表
- 应对32位程序在64位系统上访问注册表和文件自动转向问题
- C# 32位程序访问64位系统注册表
- C# 32位程序访问64位系统注册表
- 应对32位程序在64位系统上访问注册表和文件自动转向问题
- 使用.netFx4.0提供的方法解决32位程序访问64位系统的64位注册表
- C# 32位程序访问64位系统注册表
- 【转】32位程序访问64位系统的注册表问题
- 32位程序如何使用ADO访问64位Oracle数据库[转]
- C# 32位程序访问64位系统注册表
- 应对32位程序在64位系统上访问注册表和文件自动转向问题
- C# 32位程序访问64位系统注册表
- 应对32位程序在64位系统上访问注册表和文件自动转向问题
- C# 32位程序访问64位系统注册表
- C# 32位程序访问64位注册表
- C# 32位程序访问64位系统注册表
- 使用.netFx4.0提供的方法解决32位程序访问64位系统的64位注册表