CRegKey 注册表操作 转

转自 http://blog.csdn.net/pbymw8iwm/article/details/6931946

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键内,如下图

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

   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项,然后看它的默认键值是多少:

示例代码如下:

   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, LPDWORDlpdwDisposition = 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, LPDWORDlpdwDisposition =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;
}

时间: 2024-08-10 18:58:57

CRegKey 注册表操作 转的相关文章

【读书笔记】C#高级编程 第二十四章 文件和注册表操作

(一)文件和注册表 对于文件系统操作,相关的类几乎都在System.IO名称空间中,而注册表操作由System.Win32名称空间中的类来处理. (二)管理文件系统 System.MarshalByRefObject--这是.NET类中用于远程操作的基对象类,它允许在应用程序域之间编组数据. FileSystemInfo--这是表示任何文件系统对象的基类. FileInfo和File--这些类表示文件系统上的文件. DirectoryInfo和Directory--这些类表示文件系统上的文件夹.

c# 注册表操作,创建,删除,修改,判断节点是否存在

用.NET下托管语言C#操作注册表,主要内容包括:注册表项的创建,打开与删除.键值的创建(设置值.修改),读取和 删除.判断注册表项是否存在.判断键值是否存在. 准备工作: 1:要操作注册表,我们必须要引入必要的命名空间: C#代码    using Microsoft.Win32; 在这个命名空间里面包含了许多注册表相关的类,足够我们使用了~~ 2:命名空间里面提供了一个类:RegistryKey 利用它我们可以定位到注册表最开头的分支: ClassesRoot,CurrentUser,Use

[C#]注册表操作

原文:[C#]注册表操作 概念 在介绍注册表操作前,有必要了解注册表的一些基本常识. 在此简要介绍一下. 注册表 注册表(Registry,繁体中文版Windows称之为登录档)是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息.注册表组织层次结构的格式,基于存储在它的元素的逻辑顺序. 当将信息存储在注册表中,选择要存储的信息类型所基于的适当位置. 在Windows 3.x操作系统中,注册表是一个极小文件,其文件名为Reg.dat,里面只存放了某些文件类型

C#简单注册表操作实例

1.简介操作 //设置注册值 private void Button_Click(object sender, RoutedEventArgs e) { //路径及间隔符号要正确 //1.如果指定路径不存在,则创建 //2.如果指定键存在,则覆盖值 string path = "HKEY_CURRENT_USER\\myRegOne"; Registry.SetValue(path, "Expend", "hellow world!"); Mes

C#注册表操作类(完整版)

下面贴出自己用C#写的注册表操作类,欢迎大家拍砖! 1.注册表基项静态域 1 /// <summary> 2 /// 注册表基项静态域 3 /// 4 /// 主要包括: 5 /// 1.Registry.ClassesRoot 对应于HKEY_CLASSES_ROOT主键 6 /// 2.Registry.CurrentUser 对应于HKEY_CURRENT_USER主键 7 /// 3.Registry.LocalMachine 对应于 HKEY_LOCAL_MACHINE主键 8 //

Ch25 文件和注册表操作(2)-- 读写文件

老早之前就有一个想法,写一个小程序,可以读取文档,可以查找替换关键字,其实也是很简单的,正好最近看到文件系统这章,今天下午没事也就做了一个,这里总结一下: 1.用StreamReader读取文本文件,编码用Encoding.Default. StreamReader sr = new StreamReader(filePath,Encoding.Default); rtbContent.Text = sr.ReadToEnd(); sr.Close(); //释放锁定资源 2.统计要查找的字符,

内核模式下的注册表操作

注册表操作 注册表里的几个概念: 1.       创建关闭注册表项 NTSTATUS    ZwCreateKey(     OUT PHANDLE  KeyHandle,     IN ACCESS_MASK  DesiredAccess, //访问权限,一般为KEY_ALL_ACCLESS     IN POBJECT_ATTRIBUTES  ObjectAttributes,     IN ULONG  TitleIndex, //一般为NULL     IN PUNICODE_STRI

delphi 注册表操作(读取、添加、删除、修改)完全手册

DELPHI VS PASCAL(87)  32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息. 一.创建和释放TRegistry对象 1.创建TRegistry对象.为了操作注册表,要创建一个TRegistry对象:ARegistry := TRegistry.Create: 2.释放TRegistry对象.对注册表操作结束后,应释放TRegistry对象所占内存:ARegistry.Destroy. 二.指定要操作的键 操作注册表时,首先应指定操作的主键:先给属性R

Windows内核函数(3) - 内核模式下的注册表操作

Windows内核函数(3) - 内核模式下的注册表操作 2010-12-13 13:37:16|  分类: 驱动编程 |  标签:status  hkey  ulsize  注册  kdprint  |举报|字号 订阅 注册表里的几个概念: 1.       创建关闭注册表项 NTSTATUS   ZwCreateKey(    OUT PHANDLE  KeyHandle,    IN ACCESS_MASK  DesiredAccess, //访问权限,一般为KEY_ALL_ACCLESS