- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我有一个使用 RegOpenKeyEx (WinApi) 开放的注册表 HKEY。现在我想将 HKEY 转换为对象 Microsoft.Win32.RegistryKey。这将允许我使用更方便的 .Net 操作来进一步处理此 key 。
您知道如何以可靠的方式为 C# .Net 2.0 而非更高版本完成此转换吗?
感谢您的帮助!
我尝试使用反射访问 RegistryKey.GetBaseKey(hKey) 以将 HKEY 转换为 RegistryKey 但失败了:
[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
public static extern int RegOpenKeyEx(IntPtr hKey, string subKey, int ulOptions, int samDesired, out IntPtr phkResult);
public enum RegWow64Options
{
None = 0,
KEY_WOW64_64KEY = 0x0100,
KEY_WOW64_32KEY = 0x0200
}
public enum RegRights
{
ReadKey = 131097,
WriteKey = 131078
}
static void exampleTransformKeytoRegistryKey()
{
IntPtr hKeyChild;
IntPtr hKeyParent = getRegistryKeyHandle(Registry.LocalMachine);
if (hKeyParent != IntPtr.Zero)
{
int result = RegOpenKeyEx(
getRegistryKeyHandle(Registry.LocalMachine),
@"SOFTWARE\Microsoft",
0,
((int)RegRights.ReadKey) | ((int)RegWow64Options.KEY_WOW64_64KEY),
out hKeyChild);
if (result == 0)
{
// hKeyChild has been retrieved
// now convert hKeyChild to RegistryKey keyChild
Type keyType = typeof(RegistryKey);
RegistryKey keyChild = (RegistryKey)keyType.InvokeMember(
"GetBaseKey",
System.Reflection.BindingFlags.InvokeMethod | System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Static,
null,
keyType,
new object[] { hKeyChild });
// work with keyChild...
}
}
}
static IntPtr getRegistryKeyHandle(RegistryKey registryKey)
{
Type registryKeyType = typeof(RegistryKey);
System.Reflection.FieldInfo fieldInfo =
registryKeyType.GetField("hkey", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
SafeHandle handle = (SafeHandle)fieldInfo.GetValue(registryKey);
IntPtr dangerousHandle = handle.DangerousGetHandle();
return dangerousHandle;
}
更新:以下方法(在某种程度上)会起作用。请关注函数getKeyToRegistryKey。
[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
public static extern int RegOpenKeyEx(IntPtr hKey, string subKey, int ulOptions, int samDesired, out IntPtr phkResult);
public enum RegWow64Options
{
None = 0,
KEY_WOW64_64KEY = 0x0100,
KEY_WOW64_32KEY = 0x0200
}
public enum RegRights
{
ReadKey = 131097,
WriteKey = 131078
}
static void exampleTransformKeytoRegistryKey2()
{
IntPtr hKeyChild;
IntPtr hKeyParent = getRegistryKeyHandle(Registry.LocalMachine);
if (hKeyParent != IntPtr.Zero)
{
int result = RegOpenKeyEx(
getRegistryKeyHandle(Registry.LocalMachine),
@"SOFTWARE\Microsoft",
0,
((int)RegRights.ReadKey) | ((int)RegWow64Options.KEY_WOW64_32KEY),
out hKeyChild);
if (result == 0)
{
// hKeyChild has been retrieved
// now convert hKeyChild to RegistryKey keyChild
RegistryKey keyChild = getKeyToRegistryKey(hKeyChild, false, true);
// work with keyChild...
}
}
}
static RegistryKey getKeyToRegistryKey(IntPtr hKey, bool writable, bool ownsHandle)
{
//Get the BindingFlags for private contructors
System.Reflection.BindingFlags privateConstructors = System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic;
//Get the Type for the SafeRegistryHandle
Type safeRegistryHandleType = typeof(Microsoft.Win32.SafeHandles.SafeHandleZeroOrMinusOneIsInvalid).Assembly.GetType("Microsoft.Win32.SafeHandles.SafeRegistryHandle");
//Get the array of types matching the args of the ctor we want
Type[] safeRegistryHandleCtorTypes = new Type[] { typeof(IntPtr), typeof(bool) };
//Get the constructorinfo for our object
System.Reflection.ConstructorInfo safeRegistryHandleCtorInfo = safeRegistryHandleType.GetConstructor(
privateConstructors, null, safeRegistryHandleCtorTypes, null);
//Invoke the constructor, getting us a SafeRegistryHandle
Object safeHandle = safeRegistryHandleCtorInfo.Invoke(new Object[] { hKey, ownsHandle });
//Get the type of a RegistryKey
Type registryKeyType = typeof(RegistryKey);
//Get the array of types matching the args of the ctor we want
Type[] registryKeyConstructorTypes = new Type[] { safeRegistryHandleType, typeof(bool) };
//Get the constructorinfo for our object
System.Reflection.ConstructorInfo registryKeyCtorInfo = registryKeyType.GetConstructor(
privateConstructors, null, registryKeyConstructorTypes, null);
//Invoke the constructor, getting us a RegistryKey
RegistryKey resultKey = (RegistryKey)registryKeyCtorInfo.Invoke(new Object[] { safeHandle, writable });
//return the resulting key
return resultKey;
}
static IntPtr getRegistryKeyHandle(RegistryKey registryKey)
{
Type registryKeyType = typeof(RegistryKey);
System.Reflection.FieldInfo fieldInfo =
registryKeyType.GetField("hkey", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
SafeHandle handle = (SafeHandle)fieldInfo.GetValue(registryKey);
IntPtr dangerousHandle = handle.DangerousGetHandle();
return dangerousHandle;
}
这种方法的问题在于它只能在纯 .Net 2.0 应用程序中工作。如果您在 .Net 2.0 DLL 中使用代码并尝试从 .Net 4.0 应用程序中使用它,代码将失败。因此,我仍然希望找到另一种适用于混合环境的解决方案。
最佳答案
使用 RegistryKey.FromHandle(new SafeRegistryHandle(handle,true));
关于c# - HKEY 到 Microsoft.Win32.RegistryKey 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21194539/
如何使用 Microsoft.Win32.RegistryKey(或任何相关类)查询注册表项的最后写入时间? 最佳答案 您将需要使用 P/Invoke 来调用 Win32 API: MSDN: Reg
我想要在 HKEY_CURRENT_USER 中的特定 RegistryKey 发生更改时收到通知。到目前为止,我通过 WMI 尝试了这个,但没有成功: var query = new WqlEven
RegistryKey.GetSubKeyNames 函数以什么顺序返回子键?它们是按字母顺序排列的吗?或者它们的顺序是否与它们在注册表中的存储相对应? 我进行了多次搜索并检查了 MSDN,但我还没有
我试图从注册表项中获取所有子注册表项 $Key="hklm:\SOFTWARE\Wow6432Node\MyCompany\MyProj" $ComponentKeys=Get-ChildItem -
我想从注册表中读取并设置一些值,但我一直收到 NullReferenceExceptions。 public partial class Form1 : Form { RegistryKey
这不可能是对的,但它正在发生在我身上。我有以下功能: private static bool KeyExists(RegistryKey key, string search) { //Get
我正在尝试使用以下代码创建一个新的注册表项并收到此错误: Cannot write to the registry key. 我哪里错了??? var rs = new RegistrySecurit
正如标题所说。 另外,反之亦然;关闭 RegistryKey 会处理掉它吗? 我查看了所有我能找到的文档,但没有任何地方提到这一点。 最佳答案 它将调用 Close() 内部的 Dispose() 方
这个问题可能有重复 here和 here , 但他们从未得到充分的回答。 我有幸重命名了一个用户文件夹,并且不得不更改注册表中的“几个”键。这已经完成,但我很好奇是否可以自动执行此过程。为此,我尝试像
我正在尝试查询以下注册表键值: HKLM\SOFTWARE\Microsoft\MSSQLServer\Client\SharedMemoryOnHKLM\SOFTWARE\Microsoft\MSS
我是 WiX 新手。我刚刚安装了 WixW 3.7为了构建开源JiraSVN plugin .但是构建在 Visual Studio 中中断并出现以下错误: The RegistryKey eleme
我是 WiX 新手。我刚刚安装了 WixW 3.7为了构建开源JiraSVN plugin .但是构建在 Visual Studio 中中断并出现以下错误: The RegistryKey eleme
我正在使用以下方法在注册表中搜索键并返回它的值。我传入要搜索的根键和目标的相对路径作为字符串。在解析路径时,我使用上一个 key 作为打开下一个级别的基础。我不是严格只读的,所以在我完成后是否有必要关
使用 RegistryKey.GetSubKeyNames 时,一个 IOExeption 被抛出: "No more data is available" 相关代码如下: string subKey
也许这将是一个愚蠢的问题,但是之间有什么区别 RegistryKey curUser = Registry.CurrentUser; 和 RegistryKey curUser = RegistryK
我正在使用: var rk = RegistryKey.OpenRemoteBaseKey(RegistryHive.LocalMachine, "IPv6MachineAddress"); 并出现“
我从几个 *.wxs 文件创建安装包,其中几个文件是由 生成的。热实用程序并包含组件组。 现在我需要为每用户安装创建安装包。 在 Wix 创建每用户安装包的情况下,应将 RegistryKey 添加到
我正在使用Microsoft.TeamFoundation.Common.dll在云 TFS 上进行查询。在某些时候,它会尝试使用 RegistryKey.CreateSubKey 创建注册表项方法,
我需要遍历注册表并获取所有子项和所有值。 这就是我一直在尝试的(仅获取所有子项): public void OutputRegKey(RegistryKey Key) { foreach (s
This .NET API如果我尝试在与我位于同一域中的计算机中打开注册表,则工作正常(并且我的登录用户在目标计算机上具有管理员权限)。 如果它是具有不同本地管理用户(我确实知道其密码)的域外计算机,
我是一名优秀的程序员,十分优秀!