.NET使用P/Invoke来实现注册表的增、删、改、查功能
注册表可以用来进行存储一些程序的信息,例如用户的权限、或者某些值等,可以根据个人需要进行存储和删减。
当前注册表主目录:
引用包 Wesky.Net.OpenTools 1.0.5或者以上版本
操作演示:
创建注册表项
设置注册表值
读取注册表值
删除注册表值
删除注册表项
操作演示代码
IRegistryManager registryManager = new RegistryManager(); // 创建注册表项
// registryManager.CreateKey(RegistryRoot.CurrentUser, @"Wesky\MyApp"); // 设置注册表值
// registryManager.SetValue(RegistryRoot.CurrentUser, @"Wesky\MyApp", "MyValue", "Hello, Registry!"); // 读取注册表值
// var value = registryManager.GetValue(RegistryRoot.CurrentUser, @"Wesky\MyApp", "MyValue");
// Console.WriteLine($"读取到的注册表值:{value}"); // 删除注册表值
// registryManager.DeleteValue(RegistryRoot.CurrentUser, @"Wesky\MyApp", "MyValue"); // 删除注册表项
registryManager.DeleteKey(RegistryRoot.CurrentUser, @"Wesky\MyApp");
Console.WriteLine("Over");
Console.ReadKey();
核心包内源码:
[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
private 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.Auto)]
private static extern int RegOpenKeyEx(
IntPtr hKey,
string lpSubKey,
int ulOptions,
int samDesired,
out IntPtr phkResult);
[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
private static extern int RegCloseKey(IntPtr hKey);
[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
private static extern int RegSetValueEx(
IntPtr hKey,
string lpValueName,
int Reserved,
int dwType,
byte[] lpData,
int cbData);
[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
private static extern int RegGetValue(
IntPtr hKey,
string lpSubKey,
string lpValue,
int dwFlags,
out int pdwType,
StringBuilder pvData,
ref int pcbData);
[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
private static extern int RegDeleteKey(IntPtr hKey, string lpSubKey);
[DllImport("advapi32.dll", CharSet = CharSet.Auto)]
private static extern int RegDeleteValue(IntPtr hKey, string lpValueName);
/// <summary>
/// 获取注册表根键
/// Get registry root key
/// </summary>
/// <param name="root"></param>
/// <returns></returns>
/// <exception cref="ArgumentOutOfRangeException"></exception>
private IntPtr GetRegistryRootKey(RegistryRoot root)
{
switch (root)
{
case RegistryRoot.ClassesRoot:
return HKEY_CLASSES_ROOT;
case RegistryRoot.CurrentUser:
return HKEY_CURRENT_USER;
case RegistryRoot.LocalMachine:
return HKEY_LOCAL_MACHINE;
case RegistryRoot.Users:
return HKEY_USERS;
case RegistryRoot.CurrentConfig:
return HKEY_CURRENT_CONFIG;
default:
throw new ArgumentOutOfRangeException(nameof(root), root, null);
}
}
/// <summary>
/// 创建注册表键
/// Create registry key
/// </summary>
/// <param name="root"></param>
/// <param name="subKey"></param>
/// <exception cref="Exception"></exception>
public void CreateKey(RegistryRoot root, string subKey)
{
IntPtr hKey = GetRegistryRootKey(root);
int result = RegCreateKeyEx(hKey, subKey, 0, null, REG_OPTION_NON_VOLATILE, KEY_WRITE, IntPtr.Zero, out IntPtr phkResult, out _);
if (result != ERROR_SUCCESS)
{
throw new Exception("创建注册表key失败。 Failed to create registry key.");
}
RegCloseKey(phkResult);
}
/// <summary>
/// 删除注册表键
/// Delete registry key
/// </summary>
/// <param name="root"></param>
/// <param name="subKey"></param>
/// <exception cref="Exception"></exception>
public void DeleteKey(RegistryRoot root, string subKey)
{
IntPtr hKey = GetRegistryRootKey(root);
int result = RegDeleteKey(hKey, subKey);
if (result != ERROR_SUCCESS)
{
throw new Exception("删除注册表key失败。Failed to delete registry key.");
}
}
/// <summary>
/// 设置注册表值
/// Set registry value
/// </summary>
/// <param name="root"></param>
/// <param name="subKey"></param>
/// <param name="valueName"></param>
/// <param name="value"></param>
/// <exception cref="Exception"></exception>
public void SetValue(RegistryRoot root, string subKey, string valueName, string value)
{
IntPtr hKey = GetRegistryRootKey(root);
int result = RegOpenKeyEx(hKey, subKey, 0, KEY_WRITE, out IntPtr phkResult);
if (result != ERROR_SUCCESS)
{
throw new Exception("打开注册表key失败。Failed to open registry key.");
}
byte[] data = Encoding.Unicode.GetBytes(value);
result = RegSetValueEx(phkResult, valueName, 0, REG_SZ, data, data.Length);
if (result != ERROR_SUCCESS)
{
throw new Exception("设置注册表值失败。Failed to set registry value.");
}
RegCloseKey(phkResult);
}
/// <summary>
/// 获取注册表值
/// Get registry value
/// </summary>
/// <param name="root"></param>
/// <param name="subKey"></param>
/// <param name="valueName"></param>
/// <returns></returns>
/// <exception cref="Exception"></exception>
public string GetValue(RegistryRoot root, string subKey, string valueName)
{
IntPtr hKey = GetRegistryRootKey(root);
int result = RegOpenKeyEx(hKey, subKey, 0, KEY_READ, out IntPtr phkResult);
if (result != ERROR_SUCCESS)
{
throw new Exception("打开注册表key失败。Failed to open registry key.");
}
int type = 0;
int size = 1024;
StringBuilder data = new StringBuilder(size);
result = RegGetValue(phkResult, null, valueName, RRF_RT_REG_SZ, out type, data, ref size);
if (result != ERROR_SUCCESS)
{
throw new Exception("获取注册表的值失败。Failed to get registry value.");
}
RegCloseKey(phkResult);
return data.ToString();
}
/// <summary>
/// 删除注册表值
/// Delete registry value
/// </summary>
/// <param name="root"></param>
/// <param name="subKey"></param>
/// <param name="valueName"></param>
/// <exception cref="Exception"></exception>
public void DeleteValue(RegistryRoot root, string subKey, string valueName)
{
IntPtr hKey = GetRegistryRootKey(root);
int result = RegOpenKeyEx(hKey, subKey, 0, KEY_WRITE, out IntPtr phkResult);
if (result != ERROR_SUCCESS)
{
throw new Exception("打开注册表key失败。Failed to open registry key.");
}
result = RegDeleteValue(phkResult, valueName);
if (result != ERROR_SUCCESS)
{
throw new Exception("删除注册表的值失败。Failed to delete registry value.");
}
RegCloseKey(phkResult);
}
.NET使用P/Invoke来实现注册表的增、删、改、查功能的更多相关文章
- django单表操作 增 删 改 查
一.实现:增.删.改.查 1.获取所有数据显示在页面上 model.Classes.object.all(),拿到数据后,渲染给前端;前端通过for循环的方式,取出数据. 目的:通过classes(班 ...
- Django(十)模型:django模型类对数据库的:增/删/改/查、自关联、管理器、元选项(指定表名)
一.插入.更新和删除 调用一个模型类对象的save方法的时候就可以实现对模型类对应数据表的插入和更新. 调用一个模型类对象的delete方法的时候就可以实现对模型类对应数据表数据的删除. 二.自关联 ...
- oracle 11g 建库 建表 增 删 改 查 约束
一.建库 1.(点击左上角带绿色+号的按钮) 2.(进入这个界面,passowrd为密码.填写完后点击下面一排的Test按钮进行测试,无异常就点击Connect) 二.建表 1-1. create t ...
- 第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据
第18课-数据库开发及ado.net 连接数据库.增.删.改向表中插入数据并且返回自动编号.SQLDataReade读取数据 ADO.NET 为什么要学习? 我们要搭建一个平台(Web/Winform ...
- MySql——进阶一(库表的建 删 改)
基于学生管理系统建立 数据库 和 表 表的样式: 表(一)Student (学生use) 属性名 数据类型 可否为空 含 义 Sno varchar (20) 否 学号(主码) Sname varch ...
- 注册表 锁IE首页
用附件中的修改软件,或者用以下修改注册表的办法. 一.注册表被修改的原因及解决办法 其实,该恶意网页是含有有害代码的ActiveX网页文件,这些广告信息的出现是因为浏览者的注册表被恶意更改的结果. ...
- 学习window系统下的注册表
一直不明白注册表是一个什么鬼,查了资料后大概明白了注册表到底有什么用,其实简单来说注册表就是一个存放系统.硬件.应用配置信息的数据ku.##### 一.注册表的来历在最早的视窗操作系统win3.x中, ...
- S3c2440A WINCE平台HIVE注册表+binfs的实现
今天最大的收获莫过于把binfs和hive注册表同时在三星的平台上实现了,这可是前无古人啊(只是看到好多哥们说找不到三星的HIVE资料),哈哈哈.怕今天的成果日后成炮灰,还是写下来比较好,要养成这样的 ...
- 10#Windows注册表的那些事儿
引言 用了多年的Windows系统,其实并没有对Windows系统进行过深入的了解,也正是由于Windows系统不用深入了解就可以简单上手所以才有这么多人去使用.笔者是做软件开发的,使用的基本都是Wi ...
- maya2012卸载/安装失败/如何彻底卸载清除干净maya2012注册表和文件的方法
maya2012提示安装未完成,某些产品无法安装该怎样解决呢?一些朋友在win7或者win10系统下安装maya2012失败提示maya2012安装未完成,某些产品无法安装,也有时候想重新安装maya ...
随机推荐
- #线段树,矩阵乘法#LOJ 3264「ROIR 2020 Day 2」海报
题目 分析 设\(dp[i][0/1/2/3]\)表示以\(i\)结尾1的长度为0/1/2/3的最大值, 那么 \[\begin{cases}dp[i][0]=\max\{dp[i-1][\dots] ...
- OpenHarmony嵌套类对象属性变化:@Observed装饰器和@ObjectLink装饰器
上文所述的装饰器仅能观察到第一层的变化,但是在实际应用开发中,应用会根据开发需要,封装自己的数据模型.对于多层嵌套的情况,比如二维数组,或者数组项class,或者class的属性是class,他们的第 ...
- OpenHarmony Docker移植实践
Docker简介 从操作系统诞生之日起,虚拟化技术就不断的演进与发展,结合目前云原生的发展态势,容器无疑是其中的重要一环. Docker是一个开源的软件项目,可以在Linux操作系统上提供一层额外的 ...
- OpenHarmony轻量系统中内核资源主要管理方式
一.背景 OpenAtom OpenHarmony(以下简称"OpenHarmony")轻量系统面向MCU类处理器例如ARM Cortex-M.RISC-V 32位的设备,硬件资源 ...
- 深入了解 Python MongoDB 操作:排序、删除、更新、结果限制全面解析
Python MongoDB 排序 对结果进行排序 使用 sort() 方法对结果进行升序或降序排序. sort() 方法接受一个参数用于"字段名",一个参数用于"方向& ...
- Linux 使用 crontab 定时拆分日志、清理过期文件
@ 目录 前言 简介 一.准备工作 1.1 创建写入脚本 1.2 设置执行权限 1.3 添加定时任务 1.4 配置生效 二.Tomcat日志 按每天分割 2.1 创建一个 sh文件 2.2 设置执行权 ...
- HDC 2022重磅首发《鸿蒙生态应用开发白皮书》,附全文
原文:https://mp.weixin.qq.com/s/sEicsV_82770nAlcSCzwIw,点击链接查看更多技术内容. 11月4-6日,华为开发者大会2022(HDC)在东莞松山湖举 ...
- CPVT:美团提出动态位置编码,让ViT的输入更灵活 | ICLR 2023
论文提出了一种新的ViT位置编码CPE,基于每个token的局部邻域信息动态地生成对应位置编码.CPE由卷积实现,使得模型融合CNN和Transfomer的优点,不仅可以处理较长的输入序列,也可以在视 ...
- Mui 消息推送
一.push通过H5+实现 简单实现方式:通过轮询服务器是否有新消息推送过来 mui.plusReady(function() {plus.navigator.closeSplashscreen(); ...
- 龙蜥正式开源 SysOM:百万级实战经验打造!一站式运维管理平台 | 龙蜥技术
简介:SysOM集监控.告警.诊断.修复.安全能力于一体的操作系统运维平台. 文/系统运维 SIG 如果你被突如其来的 OOPS 和满屏奇怪的函数弄得满头问号?机器内存明明很大,却申请不出来内存 ...