• 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;
    }

  • 相关阅读:
    CF 848C
    BZOJ 4025 二分图
    支配树学习笔记
    CF1120D Power Tree
    Codeforces 360A(找性质)
    Codeforces 142D(博弈)
    Codeforces 142B(二分染色、搜索)
    GYM 101981E(开关反转性质)
    Codeforces 1150E(树、线段树)
    Codeforces 1150D(字符串dp)
  • 原文地址:https://www.cnblogs.com/xzh1993/p/9303276.html
Copyright © 2020-2023  润新知