CRegKey 注册表操作

1.简介

CRegKey提供了对系统注册表的操作方法,通过CRegKey类,可以方便的打开注册表的某个分支或子键(CRegKey::Open),可以方便的修改一个键的键值(CRegKey::SetValue),也可以查询某个键的键值(CRegKey::QueryValue),操作完成之后,可以关闭子键(CRegKey::Close)。

要想使用CRegKey类,需要包含头文件atlbase.h

2.常用操作方法

1) 打开需要查询或修改的注册表键

LONG Open( HKEY hKeyParent, LPCTSTR lpszKeyName, REGSAM samDesired = KEY_ALL_ACCESS );

hKeyParent参数指定了待打开的注册表键的句柄,常用的可选值为

HKEY_CLASSES_ROOT

HKEY_CURRENT_USER

HKEY_LOCAL_MACHINE

HKEY_USERS

以上四个值分别代表了注册表中最主要的四个分支;

lpszKeyName参数指定了在hKeyParent下需要打开的项的名字;

samDesired参数指定了打开该项后所拥有的权限,默认为KEY_ALL_ACCESS,表示拥有对该分支的所有操作权,包括读和写等。

 

举例:

   1: CRegKey myKey;
   2: if(myKey.Open(HKEY_LOCAL_MACHINE, "SOFTWARE//Microsoft//Windows") != ERROR_SUCCESS)
   3: {
   4:     AfxMessageBox("Error open reg key!!");
   5: }

 

2) 查询注册表项中的某个键的键值

LONG QueryValue( DWORD& dwValue, LPCTSTR lpszValueName );

LONG QueryValue( LPTSTR szValue, LPCTSTR lpszValueName, DWORD* pdwCount )

查询键值提供了两种形式,分别用来获取数值类型的值和字符串类型的值。在上面的形式中,第一种用于获取数值类型的值,第二种用于获取字符串类型的值。

lpszValueName参数用来指定键的名称,dwValue和szValue用于保存键值,而pdwCount用来控制获取到的字符串值的长度

 

举例:

比如,假设要获得windowx系统默认的桌面壁纸的搜索路径,由于这个路径保存在HKEY_LOCAL_MACHINE/SOFTWARE/Microsoft/Windows/CurrentVersion这一项的WallPaperDir键内,如下图

image

所以,可以用以下的代码来实现:

   1: CRegKey myKey;
   2: if(myKey.Open(HKEY_LOCAL_MACHINE, "SOFTWARE//Microsoft//Windows//CurrentVersion") != ERROR_SUCCESS)
   3:     AfxMessageBox("Error open reg key!!!");
   4: else
   5: {
   6:     char szPath[MAX_PATH];
   7:     DWORD dwLen = myKey.QueryValue(szPath, "WallPaperDir", MAX_PATH);
   8: }

另外,如果我们想查询某个项的默认键值该怎么办呢?只需要将lpszValueName参数写为空字符串就好了。比如现在想看一下.txt类型的文件的关联程序是谁,我们需要首先在HKEY_CLASSES_ROOT下找到.txt项,然后看它的默认键值是多少:

image

示例代码如下:

   1: CRegKey myKey;
   2: if(myKey.Open(HKEY_CLASSES_ROOT, ".txt") != ERROR_SUCCESS)
   3:     AfxMessageBox("Error open key!!!");
   4: else
   5: {
   6:     char szFileType[255];
   7:     DWORD dwLen = myKey.QueryValue(szFileType, "", sizeof(szFileType));
   8: }

3) 添加或修改键值

LONG SetValue( DWORD dwValue, LPCTSTR lpszValueName );

LONG SetValue( LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL );

LONG SetValue( HKEY hKeyParent, LPCTSTR lpszKeyName, LPCTSTR lpszValue, LPCTSTR lpszValueName = NULL );

添加键值函数提供了三种形式,前两种分别用来向当前已经打开的这个项中添加DWORD类型的键、字符串类型的键,最后一种形式的函数,可以在某个特定的分支线下的某个特定的项内添加一个键。如果lpszKeyName指定的键不存在,则添加这个键,否则,就是修改已经存在的键的键值。另外需要注意的是,最后一种形式的SetValue函数,如果lpszKeyName所指定的项不存在,则SetValue函数会返回错误,而不会添加一个项。

示例,比如现在要给IE的工具栏设置一个背景图片,可以在HKEY_CURRENT_USER/Software/Microsoft/Internet Explorer/Toolbar项下面新建一个BackBitmap的字符串键,并制定背景图片的位置,代码如下:

   1: CRegKey myKey;
   2: if(myKey.Open(HKEY_CURRENT_USER, "Software//Microsoft//Internet Explorer//Toolbar") != ERROR_SUCCESS)
   3:     AfxMessageBox("error open reg key!!!");
   4: else
   5: {
   6:     myKey.SetValue("C://WINDOWS//Web//Wallpaper//Bliss.bmp", "BackBitmap");
   7: }

这样,IE的背景图片就被设置成了C:/WINDOWS/Web/Wallpaper/Bliss.bmp

4) 删除键值

LONG DeleteValue( LPCTSTR lpszValue );

这个函数比较简单,它会删除lpszValue参数指定的键。

 

5) 新建项

LONG Create( HKEY hKeyParent, LPCTSTR lpszKeyName, LPTSTR lpszClass = REG_NONE, DWORD dwOptions = REG_OPTION_NON_VOLATILE, REGSAM samDesired = KEY_ALL_ACCESS, LPSECURITY_ATTRIBUTES lpSecAttr = NULL, LPDWORD lpdwDisposition = NULL );

Create函数用于创建一个项,它可以在hKeyParent指定的分支下,创建一个名为lpszKeyName的项,后面几个参数一般用默认的即可。

比如,现在要建立一个新的文件类型.spj的关联方式,首先需要在HKEY_CLASSES_ROOT下建立一个名为.spj的项,代码如下:

   1: CRegKey myKey;
   2: if(myKey.Create(HKEY_CLASSES_ROOT, ".spj") != ERROR_SUCCESS)
   3:     AfxMessageBox("error create key!!!");
   4: else
   5:     AfxMessageBox("create key ok!");

6) 删除项

LONG DeleteSubKey( LPCTSTR lpszSubKey );

该函数可以删除名为lpszSubKey的项,以及该项下的所有的键。注意,被删除的项不能含有子项!可以通过另外一个函数LONG RecurseDeleteKey( LPCTSTR lpszKey );删除某个项以及该项下的所有内容。

 

7) 关闭注册表

LONG Close( );

关闭注册表时,之前所做的修改才会被保存到硬盘。或者,也可以使用LONG RegFlushKey( HKEY hKey ); 函数在需要的时候将所做的修改及时写入硬盘。 

8


CRegkey::Creat(HKEY hKeyParent, LPCTSTRlpszKeyName, LPTSTRlpszClass = REG_NONE,DWORD dwOptions = REG_OPTION_NON_VOLATILE, REGSAMsamDesired= KEY_ALL_ACCESS, LPSECURITY_ATTRIBUTESlpSecAttr = NULL, LPDWORD lpdwDisposition =NULL):  创建新的key.
一般只用添加前两个值。
CRegKey::SetValue(DWORD dwValue, LPCTSTRlpszValueName); 设置值。
CRegKey::SetValue(LPCTSTR lpszKeyName, LPCTSTRlpszValue, LPCTSTRlpszValueName);在当前打开的文件夹下在设置个lpszKeyName文件夹,名是lpszValueName的数据lpszValue。
例如:CRegKey rKey;
    if(rKey.Creat(HKEY_CURRENT_USER,"XZX\\4")==ERROR_SUCESS)
      if(rk.SetValue(123,"name")==ERROR_SUCCESS)
       {
       AfxMessageBox("Successful!");
        rk.Close();
         }
remark:在根为 HKEY_CURRENT_USER的下面创建XZX\\4路径,4下面有名是name的数据123。                                                       CRegKey::Open(HKEYhKeyParent, LPCTSTRlpszKeyName, REGSAMsamDesired =KEY_ALL_ACCESS);   打开路径。
CRegKey::DeleteValue(LPCTSTR lpszValue):删除打开路径下边的值。
例如:if(rKey.Open(HKEY_CURRENT_USER,"XZX\\4")==ERROR_SUCESS)
       if(rKey.DeleteValue("name")==ERROR_SUCESS)
        AfxMessageBox("CreatSucessful!! ");
        rKey.Close();
CRegKey::DeleteSubKey(LPCTSTR lpszSubKey):删除SubKey。
例如  if(rk.Open(HKEY_CURRENT_USER,"XZX")==ERROR_SUCCESS)
    if(rk.DeleteSubKey("4")==ERROR_SUCCESS)
    {
    AfxMessageBox("sucess!");
   }
 注意:打开要删除的父文件夹,并且删除的文件下面没有值。
另一种方法:
DWORD CTools::ReadReg(char *szName,LPCTSTRszValue)
{//szName这个注册表名。 把值存到szValue。
 DWORD dwRes=1;
 HKEY hKey;
 if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
  g_szFullKey,
  NULL,KEY_ALL_ACCESS,&hKey)!=ERROR_SUCCESS)
  return FALSE;
 
 DWORDdwType,dwLen=SHORT_LEN;  
 
 if(RegQueryValueEx(hKey,szName,NULL,&dwType,(BYTE*)szValue,&dwLen)!=ERROR_SUCCESS)
  dwRes=0;
 if(RegCloseKey(hKey)!=ERROR_SUCCESS)
  dwRes=0;
 
 return dwRes;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/445124.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

进程基础

进程的基本概念 程序顺序执行的特征: 1)顺序性:处理机严格按照程序所规定的顺序执行,每一步操作必须在下一步操作开始前执行 2)封闭性:程序在封闭的环境下运行,程序独占资源,资源的状…

用Docker容器自带的tensorflow serving部署模型对外服务

相信很多人和我一样,在试图安装tensorflow serving的时候,翻遍了网上的博客和官网文档,安装都是以失败而告终,我也是一样,这个问题折磨了我两个星期之久,都快放弃了。幸运的是在同事的建议下,我…

C资源

云风最近写了一篇博客《C语言的前世今生》。作为长期使用C语言开发网络游戏服务器的程序员,云风是有理由写这样一篇文字,不过还是感觉谈的不够深入,C语言在业界使用的现状没有怎么描写,有些意犹未尽。在这里想比较系统的谈谈个人对…

面试题汇总---深度学习(图像识别,NLP内容)

文章目录1.基本概念1.1 为什么神经网络中深度网络的表现比广度网络表现好?1.2 推导BP算法1.3 什么是梯度消失和梯度爆炸?1.4 常用的激活函数有哪些?1.5 常用的参数更新方法有哪些?1.6 解决过拟合的方法?数据层面模型层…

Python(28)-文件,os模块

文件1. 文件2. 文件的基本操作3. 读取文件open()3.1 文件指针: 标记从哪一个位置开始读取数据.3.2 文件的打开方式mode3.3 文件按行读取3.3.1 readline()3.3.2 readlines()4.文件输出f.write(),print()5.文件复制5.1 小文件复制(搬家)5.2 大文件复制&…

IOCP的程序

C代码 #include <winsock2.h> #include <mswsock.h> #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <assert.h> #include "vld.h" #pragma message("automatic link to ws2_32.lib and…

PaperNotes(3)-图像分割-RCNN-FCN-Boxsup

图像分割算法对比小结1.{基本概念}2.{R-CNN}2.1R-CNN 网络结构选择性搜索算法为什么选择SVM作分类器边框回归2.2{R-CNN 训练}2.3{R-CNN实验结果}2.4{R-CNN语义分割}2.5{补充材料}2.5.1{R-CNN建议区域放缩}2.5.2{IOU阈值设置不一样的原因}2.5.3{Bounding-box回归修正}2.6{R-CNN存…

Python模块(3)--PIL 简易使用教程

PIL模块-用与记1.图片导入Image.open()2.图像显示.show()4.查看图片属性.format,.size,.mode3.图像格式转换.convert()4.图像模式“L”&#xff0c;“RGB”,"CYMK"5. 图片旋转.rotate()旋转方式1&#xff1a;旋转不扩展旋转方式2&#xff1a;旋转扩展旋转方式3&#…

输入输出系统

I/O设备&#xff1a;输入输出和存储功能的设备 I/O设备的分类 按传输的速度&#xff1a; 低速设备&#xff08;如键盘、鼠标、语音输入输出设备&#xff09; 中速设备&#xff08;如行式打印机、激光打印机等&#xff09; 高速设备&#xff08;如磁带机、磁盘机、光盘机等&…

模拟银行家算法

介绍 data.h #ifndef _Data_h_ #define _Data_h_#include <stdio.h> #include <stdlib.h> #include <string.h>#define ElemType PCB #define Status int #define true 1 #define false 0 #define OK 1 #define ERROR 0 #define RESOURCE_NUM …

js知识点汇总

1.本门课的作用&#xff08;JavaScript的作用&#xff09;所有基于Web的程序开发基础 2.一种计算机客户端脚本语言&#xff0c;主要在Web浏览器解释执行。 3.浏览器中Javascript&#xff0c;用于与用户交互&#xff0c;以及实现页面中各种动态特效 4.在HTML文件中&#xff0…

关于Java中String的问题

String 对象的两种创建方式&#xff1a; String str1 "abcd";//先检查字符串常量池中有没有"abcd"&#xff0c;如果字符串常量池中没有&#xff0c;则创建一个&#xff0c;然后 str1 指向字符串常量池中的对象&#xff0c;如果有&#xff0c;则直接将 st…

如何判断对象已经死亡

引用计数 给对象中添加一个引用计数器&#xff0c;每当有一个地方引用它&#xff0c;计数器就加 1&#xff1b;当引用失效&#xff0c;计数器就减 1&#xff1b;任何时候计数器为 0 的对象就是不可能再被使用的。 这个方法实现简单&#xff0c;效率高&#xff0c;但是目前主流…

算法(2)-二叉树的遍历(递归/迭代)python实现

二叉树的遍历1.深度优先DFS1.1 DFS 递归解法1.1.1先序遍历1.1.2中序遍历1.1.3后序遍历1.2 DFS迭代解法1.2.1先序遍历1.2.2中序遍历1.2.3后序遍历2.广度优先BFS3.二叉树的最大深度3.1递归3.2迭代4.翻转二叉树4.1递归4.1迭代5.合并两棵二叉树5.1递归5.2迭代有两种通用的遍历树的策…

利用posix_fadvise清理系统中的文件缓存

利用posix_fadvise清理系统中的文件缓存leoncom c/c,unix2011-08-03当我们需要对某段读写文件并进行处理的程序进行性能测试时&#xff0c;文件会被系统cache住从而影响I/O的效率&#xff0c;必须清理cache中的对应文件的才能正确的进行性能测试。通常清理内存可以采用下面的这…

空间分配

目前主流的垃圾收集器都会采用分代回收算法&#xff0c;因此需要将堆内存分为新生代和老年代&#xff0c;这样我们就可以根据各个年代的特点选择合适的垃圾收集算法。 大多数情况下&#xff0c;对象在新生代中 eden 区分配。当 eden 区没有足够空间进行分配时&#xff0c;虚拟…

创建与打开IPC通道的POSIX和SYSTEM V方法

先说&#xff30;&#xff2f;&#xff33;&#xff29;&#xff38;的吧&#xff1a; mq_open&#xff0c;sem_open&#xff0c;shm_open着三个函数用于创建或者打开一个IPC通道。 由此可见&#xff0c;消息队列的读写权限是任意的&#xff0c;然而信号灯就没有&#xff0c;…

软件测试基础知识

第一章 1.1 软件测试背景知识和发展史 互联网公司职位架构&#xff1a;产品 运营 技术 市场 行政软件测试&#xff1a;使用人工或自动化手段&#xff0c;来运行或测试某个系统的过程&#xff0c;其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别&#…

Jmeter-基础篇

常用压力测试工具对比 1、loadrunner 性能稳定&#xff0c;压测结果及细粒度大&#xff0c;可以自定义脚本进行压测&#xff0c;但是太过于重大&#xff0c;功能比较繁多 2、apache ab(单接口压测最方便) 模拟多线程并发请求,ab命令对发出负载的计算机…

shell一文入门通

简单来说“Shell编程就是对一堆Linux命令的逻辑化处理”。 W3Cschool 上的一篇文章是这样介绍 Shell的 hello world 学习任何一门编程语言第一件事就是输出HelloWord了&#xff01;下面我会从新建文件到shell代码编写来说下Shell 编程如何输出Hello World。 (1)新建一个文件…