C/C++注册表【4】键值的获取,设置,删除,枚举
C/C++注册表【4】键值的获取,设置,删除,枚举
1、键值的获取:
LONG WINAPI RegQueryValueEx(HKEY hKey, //一个已打开项的句柄,或者指定一个标准项名LPCTSTR lpValueName, // 要获取值的名字LPDWORD lpReserved, // 未用,设为零LPDWORD lpType, // 用于装载取回数据类型的一个变量LPBYTE lpData, // 用于装载指定值的一个缓冲区LPDWORD lpcbData // 用于装载lpData缓冲区长度的一个变量。一旦返回,它会设为实际装载到缓冲区的字节数
);
返回值 Long,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码
MSDN介绍:https://docs.microsoft.com/zh-cn/windows/desktop/api/winreg/nf-winreg-regdeletevaluea
lpValueName 指向要查询值的名字的字符串(以空字符结束)。 如果lpValueName是NULL或一个空字符串(""),这个函数找回这个键的未命名或默认值的类型和数据。 Windows 95和Windows 98: 每个键有一个默认值(最初的不包含数据)。在Windows 95,这人默认值类型总是REG_SZ。在Windows 98,默认键的类型最初是REG_SZ,但可以通过RegSetValueEx指定一个默认值为不同的类型。
实例:
void CTestDlg::OnBnClickedOk()
{// TODO: 在此添加控件通知处理程序代码HKEY hKey = NULL;TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);if (lRet == ERROR_SUCCESS) {DWORD dwValueCount = 0, maxValueNameLen = 0, maxValueDataLen = 0;lRet = RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &dwValueCount, &maxValueNameLen, &maxValueDataLen, NULL, NULL);if (lRet == ERROR_SUCCESS) {DWORD dwType = 0;BYTE *lpData = new BYTE[maxValueDataLen + 1];ZeroMemory(lpData, maxValueDataLen + 1);lRet = RegQueryValueEx(hKey, _T("360Safetray"), NULL, &dwType, lpData, &maxValueDataLen);CString strValue;strValue.Format(_T("%s"), lpData);MessageBox(strValue);delete[] lpData;}RegCloseKey(hKey);}CDialogEx::OnOK();
}
2、键值设置:
RegSetValueEx函数可以设置注册表中键的值,函数原型如下:
LONG RegSetValueEx(HKEY hKey, //主键值LPCTSTR lpValueName, //参数lpValueName为一个指向包含值名的字符串指针。DWORD Reserved, //Reserved保留,通常必须设置为0DWORD dwType, //参数dwType确定了设置的值的类型同RegQueryValueKeyEx的lyType参数。CONST BYTE *lpData, //参数lpData为一个指向包含数据的缓冲区的指针DWORD cbData //参数cbData以字节为单位,指定数据的长度);
返回值 Long,零(ERROR_SUCCESS)表示成功。其他任何值都代表一个错误代码
实例:
void CTestDlg::OnBnClickedOk()
{// TODO: 在此添加控件通知处理程序代码HKEY hKey = NULL;TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);if (lRet == ERROR_SUCCESS) {CString strPath = _T("F:\\工具\\fildder\\Fiddler\\Fiddler.exe");RegSetValueEx(hKey, _T("GP_CLT_JIT"), 0, REG_SZ, (LPBYTE)strPath.GetBuffer(), strPath.GetLength() * sizeof(TCHAR));RegCloseKey(hKey);}CDialogEx::OnOK();
}
3、键值的删除:RegDeleteValue
LSTATUS RegDeleteValueA(HKEY hKey,LPCSTR lpValueName
);
void CTestDlg::OnBnClickedOk()
{// TODO: 在此添加控件通知处理程序代码HKEY hKey = NULL;TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);if (lRet == ERROR_SUCCESS) {RegDeleteValue(hKey, _T("TestRun"));RegCloseKey(hKey);}CDialogEx::OnOK();
}
4、键值的枚举操作:RegEnumValue
RegEnumValue(hkey, //被枚举的键句柄dwIndex, //子键索引编号lpValueName, //键值名称lpcbValueName, //键值名称长度lpReserved, //系统保留,指定为0lpType, //键值数据类型lpDate, //键值数据lpcbDate //键值数据长度);
实例:
void CTestDlg::OnBnClickedOk()
{// TODO: 在此添加控件通知处理程序代码HKEY hKey = NULL;TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);if (lRet == ERROR_SUCCESS) {DWORD dwValueCount = 0, maxValueNameLen = 0, maxValueDataLen = 0;lRet = RegQueryInfoKey(hKey, NULL, NULL, NULL, NULL, NULL, NULL, &dwValueCount, &maxValueNameLen, &maxValueDataLen, NULL, NULL);if (lRet == ERROR_SUCCESS) {DWORD dwNameLen = maxValueNameLen + 1;TCHAR *pszName = new TCHAR[dwNameLen];DWORD dwType = 0;DWORD dwValueDataLen = maxValueDataLen + 1;BYTE *lpValueData = new BYTE[dwValueDataLen];for (DWORD dwIndex = 0; dwIndex < dwValueCount; ++dwIndex) {dwNameLen = maxValueNameLen + 1;ZeroMemory(pszName, dwNameLen);dwValueDataLen = maxValueDataLen + 1;ZeroMemory(lpValueData, dwValueDataLen);lRet = RegEnumValue(hKey, dwIndex, pszName, &dwNameLen, NULL, &dwType, lpValueData, &dwValueDataLen);//Other operationsCString strValueName;strValueName.Format(_T("%s"), pszName);MessageBox(strValueName); //子键名称CString strValueData;strValueData.Format(_T("%s"), lpValueData);MessageBox(strValueData); //子键的value}delete[] pszName;delete[] lpValueData;RegCloseKey(hKey);}}CDialogEx::OnOK();
}
声明:本代码参考部分VC驿站教程。
C/C++注册表【4】键值的获取,设置,删除,枚举相关推荐
- 注册表各键值保存的内容及其对用的作用(功能)(不完善,有补充的评论指出供大家学习参考)
从Windows 95开始,Microsoft在Windows中引入了注册表(英文为REGISTRY)的概念(实际上原来在Windows NT中已有此概念).注册表是Windows 95及Window ...
- C#获取注册表指定键值
某些程序必须依赖指定运行环境.那么读取注册表来判断此电脑是否有执行环境是个很不错的办法.因为每个软件安装之后都会在注册表中注册对应的键值,并且有些键值是独一无二的.那么首先就需要找到那个具体的独一无二 ...
- # 删除注册表项键值_强制删除:让你的电脑上不再有“顽固”程序
微信搜一搜麦克NO1对于很多用户来说,在日常使用电脑的时候,经常会有意无意的安装一些程序.而这些程序也是严重影响了电脑的运行速度.所以,在忍无可忍的情况下,需要将这些"顽固"程序卸 ...
- [C++]用VC++来设置获得注册表的键值(问题解决)
下面这个是基于MFC的基本对话写的.. 演示设置注册表的3中类型的值和获得注册表的3中类型的值.. 分别用RegSetValueEx()来设置,RegQueryValueEx()函数来获得. voi ...
- java读取注册表_Java通过CMD方式读取注册表任意键值对代码实践
需要读取如图所示注册表[HKEY_LOCAL_MACHINE\SOFTWARE\EasyDrv7]节点下的[DateTime]的值 直接上代码: package com.beibei.common.u ...
- windows注册表几大键值
什么是注册表? 从Windows 95开始,Microsoft在Windows中引入了注册表(英文为REGISTRY)的概念(实际上原来在Windows NT中已有此概念).注册表是Windows ...
- 批量删除注册表特定键值的小技巧
今天使用虚拟机的时候发现了一个小的问题,我的ubunto需要使用18.04,但是我用的虚拟机是版本12的,不能正常加载,但是在别人的电脑上就能成功,看他们的版本是15.0的所以我也想吧我的虚拟机升级到 ...
- js读取注册表的键值
try { var shell = new ActiveXObject("WScript.Shell"); --读取注册表 var key = shell.RegRead(&q ...
- delphi 注册表操作之(读取、添加、删除、修改)
32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息. 一.创建和释放TRegistry对象 1.创建TRegistry对象.为了操作注册表,要创建一个TRegistry对象: ...
最新文章
- 审稿人眼中的好论文到底长什么样?
- linux 下 C 编程和make的方法 (十、C版的try catch 捕捉段错误和异常处理)
- MySQL Replication 主从复制全方位解决方案
- Shell教程(六):函数、联机帮助
- 《高效能人士的七个习惯》
- qt 下log4cplus的使用
- react封装函数_React 模式-将函数作为 children 传入和 render prop - 极客教程
- 14款荣耀/华为机型获版本升级: 适配FlyPods Pro骨声纹识别
- 计算机做镜像步骤,如何将当前的操作系统做成镜像?
- 'GO' 附近有语法错误问题,我真是无语~
- urllib.error.URLError: <urlopen error [SSL: WRONG_VERSION_NUMBER] wrong version number 成功解决
- React:Hook
- RS232串口转USB驱动无法正确识别
- sys caffe教程
- 如何将html页面打印出来,网页太长如何全部打印_怎样打印整个网页内容-win7之家...
- 光模块发射光功率和接收灵敏度介绍
- LR参数化,参数化类型:Fille类型--参数分配与取值规律
- EDM邮件营销的背景和市场分析
- Photoshop 快捷键设置之进化
- 4成药企要退出,他们的药代知道吗?