386.使用CWin32API注册表操作

一赫技术 2024-03-27 03:30:08

在C#中,我们可以使用Windows Win32 API来对系统注册表进行操作。注册表是Windows操作系统中用来存储配置信息的重要数据库,我们可以通过C#来读取、写入和删除注册表中的键和值。

下面是一些使用C#调用系统Windows Win32 API注册表操作的示例:

读取注册表键值RegOpenKeyEx

用于打开指定的注册表键。它的参数说明如下:

hKey:指定要打开的注册表键的句柄。可以是以下值之一: HKEY_CLASSES_ROOT HKEY_CURRENT_USER HKEY_LOCAL_MACHINE HKEY_USERS HKEY_CURRENT_CONFIG 或者其他通过RegCreateKeyEx或RegOpenKeyEx打开的注册表键的句柄。lpSubKey:要打开的注册表键的名称。例如:"SOFTWARE\MyApp"。ulOptions:保留参数,通常设置为0。samDesired:指定打开注册表键的访问权限和选项。可以是以下值之一或它们的组合: KEY_READ(只读) KEY_WRITE(写入) KEY_ALL_ACCESS(完全访问权限)phkResult:用于接收打开的注册表键的句柄。

函数返回值为整型,表示操作的结果。

RegQueryValueEx

用于检索指定注册表键的值。它的参数说明如下:

hKey:指定要查询的注册表键的句柄。lpValueName:要查询的注册表值的名称。lpReserved:保留参数,通常设置为0。lpType:用于接收键值数据的类型。例如,REG_SZ、REG_DWORD等。lpData:用于接收键值数据的缓冲区的指针。lpcbData:指定lpData缓冲区的大小,以字节为单位。在调用函数之前,它指定lpData缓冲区的大小。在函数返回时,它包含实际写入lpData缓冲区的字节数。

函数返回值为整型,表示操作的结果。

using System;using Microsoft.Win32.SafeHandles;using System.Runtime.InteropServices;class Program{ // 定义Win32 API函数 [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] public static extern int RegOpenKeyEx( IntPtr hKey, string lpSubKey, int ulOptions, int samDesired, out IntPtr phkResult ); [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] public static extern int RegQueryValueEx( IntPtr hKey, string lpValueName, int lpReserved, out uint lpType, IntPtr lpData, ref uint lpcbData ); static void Main() { IntPtr hKey; IntPtr phkResult; uint lpType; uint lpcbData = 1024; IntPtr lpData = Marshal.AllocHGlobal((int)lpcbData); // 打开注册表键 int result = RegOpenKeyEx( new IntPtr((int)RegistryHive.CurrentUser), "SOFTWARE\\MyApp", 0, 0x20019, // KEY_READ out phkResult ); // 读取键值 result = RegQueryValueEx( phkResult, "MySetting", 0, out lpType, lpData, ref lpcbData ); string value = Marshal.PtrToStringUni(lpData); // 输出键值 Console.WriteLine(value); // 释放内存 Marshal.FreeHGlobal(lpData); // 关闭注册表键 SafeRegistryHandle safeHandle = new SafeRegistryHandle(phkResult, true); safeHandle.Dispose(); }}

读取之前需要先创建一个Key

写入注册表键值RegSetValueEx

用于设置指定注册表键的值。它的参数说明如下:

hKey:指定要设置值的注册表键的句柄。lpValueName:要设置的注册表值的名称。reserved:保留参数,通常设置为0。dwType:指定要设置的值的数据类型。可以是以下值之一: REG_SZ:字符串类型 REG_DWORD:双字类型 REG_BINARY:二进制数据类型 REG_MULTI_SZ:多字符串类型 等等lpData:指向包含要设置的值的数据的缓冲区的指针。cbData:指定lpData缓冲区的大小,以字节为单位。

函数返回值为整型,表示操作的结果。

using System;using Microsoft.Win32.SafeHandles;using System.Runtime.InteropServices;class Program{ // 定义Win32 API函数 [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] public static extern int RegCreateKeyEx( IntPtr hKey, string lpSubKey, int reserved, string lpClass, int dwOptions, int samDesired, IntPtr lpSecurityAttributes, out IntPtr phkResult, out int lpdwDisposition ); [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] public static extern int RegSetValueEx( IntPtr hKey, string lpValueName, int reserved, int dwType, string lpData, int cbData ); static void Main() { IntPtr hKey; IntPtr phkResult; int lpdwDisposition; // 创建或打开注册表键 int result = RegCreateKeyEx( new IntPtr((int)RegistryHive.CurrentUser), "SOFTWARE\\MyApp", 0, null, 0, 0x20006, // KEY_WRITE IntPtr.Zero, out phkResult, out lpdwDisposition ); // 写入键值 result = RegSetValueEx( phkResult, "MySetting", 0, 1, // REG_SZ "123", 6 ); // 关闭注册表键 SafeRegistryHandle safeHandle = new SafeRegistryHandle(phkResult, true); safeHandle.Dispose(); }}

删除注册表键值class Program{ // 定义Win32 API函数 [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] public static extern int RegOpenKeyEx( IntPtr hKey, string lpSubKey, int ulOptions, int samDesired, out IntPtr phkResult ); // 定义Win32 API函数 [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] public static extern int RegDeleteValue( IntPtr hKey, string lpValueName ); static void Main() { IntPtr hKey; IntPtr phkResult; // 打开注册表键 int result = RegOpenKeyEx( new IntPtr((int)RegistryHive.CurrentUser), "SOFTWARE\\MyApp", 0, 0x20006, // KEY_WRITE out phkResult ); // 删除键值 result = RegDeleteValue( phkResult, "MySetting" ); // 关闭注册表键 SafeRegistryHandle safeHandle = new SafeRegistryHandle(phkResult, true); safeHandle.Dispose(); }}删除注册表键class Program{ // 定义Win32 API函数 [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] public static extern int RegOpenKeyEx( IntPtr hKey, string lpSubKey, int ulOptions, int samDesired, out IntPtr phkResult ); // 定义Win32 API函数 [DllImport("advapi32.dll", CharSet = CharSet.Unicode, SetLastError = true)] public static extern int RegDeleteKey( IntPtr hKey, string lpSubKey ); static void Main() { IntPtr hKey; IntPtr phkResult; // 打开注册表键 int result = RegOpenKeyEx( new IntPtr((int)RegistryHive.CurrentUser), "SOFTWARE", 0, 0x20019, // KEY_READ out phkResult ); // 删除注册表键 result = RegDeleteKey( phkResult, "MyApp" ); // 关闭注册表键 SafeRegistryHandle safeHandle = new SafeRegistryHandle(phkResult, true); safeHandle.Dispose(); }}

通过以上示例,我们可以看到如何使用C#调用系统Windows Win32 API注册表操作。需要注意的是,对注册表的操作需要谨慎,不当的操作可能会导致系统故障,建议在操作注册表时谨慎处理。

0 阅读:1

一赫技术

简介:感谢大家的关注