C++操作注册表

一、注册表
1.简介
注册表(Registry,繁体中文版Windows操作系统称之为登录档)是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息。早在Windows 3.0推出OLE技术的时候,注册表就已经出现。随后推出的Windows NT是第一个从系统级别广泛使用注册表的操作系统。但是,从Microsoft Windows 95操作系统开始,注册表才真正成为Windows用户经常接触的内容,并在其后的操作系统中继续沿用至今。
2.注册表权限修改:
1):在运行对话框中输入:regedit,点击确定或按回车键(Enter),打开注册表编辑器,在注册表编辑器窗口,左键单击:HKEY_CURRENT_USER,再点击:编辑-权限。
2):此时,打开了HKEY_CURRENT_USER的权限对话框,在这个对话框中,先查看本机登录的用户名,如组或用户名(G)栏中没有,点击:高级选项。
3):在打开的HKEY_CURRENT_USER的高级安全设置窗口,点击:添加。
4):在HKEY_CURRENT_USER的高级安全设置窗口,点击添加以后,就会打开HKEY_CURRENT_USER的权限项目窗口,在这个窗口中,基本权限项都呈灰色状态不可选择,点击:选择主体。
5):在打开的选择用户和组对话框中,点击:高级。
6):按下来,在对话框中点击:立即查找(N)在搜索结果(U)栏中用鼠标按住右侧的小滑块向下拖动,找到本机登录的用户名如:GONG ZOU,并左键单击用户名,再点击:确定。
7):点击确定以后,可以看到本机登录用户名显示在检查名称栏中,点击:确定。
8):这时就会回到HKEY_CURRENT_USER的高级安全设置窗口,在这个窗口,点击:显示高级权限,在HKEY_CURRENT_USER的权限项目窗口的高级权限下,点击完全控制,再点击确定。
9):回到HKEY_CURRENT_USER的高级安全设置窗口,点击:应用-确定。
10):回到HKEY_CURRENT_USER的权限窗口,点击:确定,退出注册表编辑器。
二、相关函数
1、RegCloseKey()

  原型:RegCloseKey(HKEY hKey)

  解释:关闭指定的主册表键,释放句柄。当对一个或多个键或值操作完成以后,需要关闭其键来进行保存操作结果,关闭一个键后,句柄变为非法,此时应释放句柄。

  2、RegCreateKeyEx()

  原型:LONG RegCreateKeyEx( HKEY hKey, LPCTSTR lpSubKey, DWORD Reserved,
LPTSTR lpClass, DWORD dwOptions, REGSAM samDesired, LPSECURITY_ATTRIBUTES lpSecurityAttributes,
PHKEY phkResult, LPDWORD lpdwDisposition );

  解释:打开指定的键或子键。如果要打开的键不存在的话,本函数会试图建立它。提供该函数是为了向后兼容。所有的WIN32应用程序应使用函数RegCreateKeyEx()。各参数及返回值的含义如下:

  各参数及返回值的含义如下:

  ·hKey为主键值,可以取下面的一些数值:HKEY_CLASSES_ROOT、HKEY_CURRENT_CONFIG、  HKEY_CURRENT_USER、HKEY_LOCAL_MACHINE、HKEY_USER、HKEY_PERFORMANCE_DATA(WINNT操作系统)、HKEY_DYN_DATA(WIN9X操作系统);

  ·参数lpSubKey为一个指向以零结尾的字符串的指针,其中包含将要创建或打开的子键的名称。子键不可以用反斜线(\)开始。该参数可以为NULL;

  ·参数Reserved为保留值,必须设置为0;

  ·参数lpClass为一个指向包含键类型的字符串。如果该键已经存在,则忽略该参数;

  ·参数dwOptions为新创建的键设置一定的属性。可以取下面的一些数值:  REG_OPTION_NON_VOLATILE ,表示新创建的键为一个非短暂性的键(数据信息保存在文件中,当系统重新启动时,数据信息恢复);REG_OPTION_VOLATILE,表示新创建的键为一个短暂性的键(数据信息保存在内存中),Windows95忽略该数值;REG_OPTION_BACKUP_RESTORE 仅在WINNT中支持,可以提供优先级支持;

  ·参数samDesired用来设置对键访问的权限,可以取下面的一些数值:KEY_CREATE_LINK,表示准许生成符号键;KEY_CREATE_SUB_KEY 表示准许生成子键;KEY_ENUMERATE_SUB_KEYS 表示准许生成枚举子键;KEY_EXECUTE 表示准许进行读操作;KEY_NOTIFY表示准许更换通告;   KEY_QUERY_VALUE 表示准许查询子键;KEY_ALL_ACCESS 提供完全访问,是上面数值的组合;

  KEY_READ 是下面数值的组合:KEY_QUERY_VALUE、KEY_ENUMERATE_SUB_KEYS、KEY_NOTIFY;  KEY_SET_VALUE 表示准许设置子键的数值;KEY_WRITE 是下面数值的组合:KEY_SET_VALUE、KEY_CREATE_SUB_KEY;

  ·参数lpSecurityAttributes为一个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否被子处理过程继承。如果该参数为NULL,则句柄不可以被继承。在WINNT中,该参数可以为新创建的键增加安全的描述;

  ·参数phkResult为一个指向新创建或打开的键的句柄的指针;

  ·参数lpdwDispition指明键是被创建还是被打开的,可以是下面的一些数值:  REG_CREATE_NEW_KEY 表示键先前不存在,现在被创建;REG_OPENED_EXISTING_KEY 表示键先前已存在,现在被打开。

  如果该函数调用成功,则返回ERROR_SUCCESS。否则,返回值为文件WINERROR.h中定义的一个非零的错误代码,可以通过设置FORMAT_MESSAGE_FROM_SYSTEM标识调用FormatMessage()函数来获取一个对错误的总体描述。

  3、RegOpenKeyEx()

  原型:LONG RegOpenKeyEx(HKEY hKey, LPCTSTR lpSubKey, DWORD ulOptions,
REGSAM samDesired, PHKEY phkResult );

  解释:打开一个指定的键,并返回打开键的句柄。

  各参数及返回值的含义如下:

  ·参数hKey的含义同RegCreateKeyEx函数中的hKey参数;

  ·参数lpSubKey为一个指向以零结尾的字符串的指针,其中包含子键的名称,可以利用反斜线(\)分隔不同的子键名。如果字符串为空,则根据hKey参数创建一个新的句柄。在这种情况下,并不关闭先前打开的句柄;

  ·参数ulOption保留,通常必须设置为0;

  ·参数samDesired的含义同RegCreateKeyEx函数中的samDesired参数;

  ·参数phkResult为一个指针,用来指向打开的键的句柄。可以通过RegCloseKey函数关闭这个句柄;

  ·函数的返回值同RegCreateKeyEx函数的返回值。

  4、 查询某一个键值:RegQueryValueEx()

  原型:LONG RegQueryValueEx(HKEY hKey, LPCTSTR lpValueName, LPDWORD pReserved, LPDWORD lpType,
LPBYTE lpData, LPDWORD lpcbData );

  解释:根据要查询的键的句柄,要返回的查询的数据。

  各个参数及返回值的含义如下:

  ·参数hKey为当前的一个打开的键的句柄,具体数值同RegCreateKeyEx函数的hKey参数;

  ·参数lpVauleName为一个指向非空的包含查询值的名称的字符串指针;

  ·参数lpReserved保留,必须为NULL;

  ·参数lpType为一个指向数据类型的指针,数据类型为下列类型之一:REG_BINARY 二进制数据、REG_DWORD 32位整数、REG_DWORD_LITTLE_ENDIAN little-endian格式的数据,例如0X12345678以(0X78 0X56 0X34 0X12)方式保存、REG_DWORD_BIG_ENDIAN big-endian格式的数据,例如0X12345678以(0X12 0X34 0X56 0X78)方式保存、REG_EXPAND_SZ 一个包含未扩展环境变量的字符串、REG_LINK 一个Unicode类型的链接、REG_MULIT_SZ 以两个零结尾的字符串、REG_NONE 无类型数值、REG_RESOURCE_LIST 设备驱动资源列表、REG_SZ 一个以零结尾的字符串根据函数使用的字符集类型的不同而设置为Unicode或ANSI类型的字符串;

  ·参数lpData为一个指向保存返回值的变量的指针。如果不需要返回值,该参数可以为NULL;

  ·参数lpcbData为一个指向保存返回值长度的变量的指针。其中长度以字节为单位。如果数据类型为REG_SZ、REG_MULTI_SZ或REG_EXPAND_SZ,那么长度也包括结尾的零字符,只有在参数lpData为NULL时,参数lpcbData才可以为NULL;返回值同RegCreateKeyEx函数的返回值;

  5、RegSetValueEx()

  原型:LONG RegSetValueEx(HKEY hKey, LPCTSTR lpValueName, LPDWORD lpReserved, DWORD dwType,
const BYTE *lpData, DWORD cbData);

  解释:设置注册表中的一个键值。

  各个参数及返回值的含义如下:

  ·参数hKey的含义同RegCreateKeyEx函数中的hKey参数;

  ·参数lpValueName为一个指向包含值名的字符串指针;Reserved保留,通常必须设置为0;

  ·参数dwType确定了设置的值的类型同RegQueryValueKeyEx的lyType参数;

  ·参数lpData为一个指向包含数据的缓冲区的指针;

  ·参数cbData以字节为单位,指定数据的长度;

  返回值同RegCreateKeyEx函数的返回值。

  6、RegDeketeKey()

  原型:LONG RegDeleteKey(HKEY hKey,LPCTSTR lpSubKEY);

  解释:函数RegDeketeKey删除一个键及所有的子键。

  各个参数及返回值的含义如下:

  ·参数hKey的含义同RegCreateKeyEx函数中的hKey参数;

  ·参数lpSubKey的含义同RegCreateKeyEx函数中的lpSubKey参数。 
3. 实例
(1)读取注册表
1.查看HKEY_CURRENT_USER主键下Software\Microsoft\FTH子键中名称为TicketValue的值,其类型为DWORD。

void  OnBnClickedQuery() 
{
    HKEY hKEY;//定义有关的hKEY,在查询结束时要关闭
    //打开与路径data_Set相关的hKEY
    LPCTSTR data_Set= _T("Software\\Microsoft\\FTH");
    //访问注册表,hKEY则保存此函数所打开的键的句柄
if(ERROR_SUCCESS==RegOpenKeyEx(HKEY_CURRENT_USER,data_Set,0,KEY_READ,&hKEY))
    {
              DWORD dwValue;
              DWORD dwSize = sizeof(DWORD);
              DWORD dwType = REG_DWORD;
              if (::RegQueryValueEx(hKEY,_T("GridProgressColumnIndex"), 0, &dwType, (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS)
                  {
                         AfxMessageBox(_T("错误:无法查询有关的注册表信息"));
                  }
           //程序结束,关闭打开的hKEY
           ::RegCloseKey(hKEY);
    }
}

可以看到读取的注册表TicketValue的值是正确的。

2.查看HKEY_LOCAL_MACHINE主键下SOFTWARE\Microsoft\Windows NT\CurrentVersion子键中名称为”SoftwareType的值,其类型为REG_SZ。

void OnBnClickedQuery()
{
       HKEY hKEY;//定义有关的hKEY,在查询结束时要关闭
       //打开与路径data_Set相关的hKEY
       LPCTSTR data_Set= _T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
       //访问注册表,hKEY则保存此函数所打开的键的句柄
       if (ERROR_SUCCESS ==RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set,0,KEY_READ,&hKEY))
       {
            char dwValue[256];
            DWORD dwSzType = REG_SZ;
            DWORD dwSize = sizeof(dwValue);

           if (RegQueryValueEx(hKEY,_T("SoftwareType"), 0, &dwSzType, (LPBYTE)&dwValue, &dwSize) != ERROR_SUCCESS)
              {
                   AfxMessageBox(_T("错误:无法查询有关的注册表信息"));
              }
              //程序结束,关闭打开的hKEY
              ::RegCloseKey(hKEY);
       }
}

(2)写注册表
1.在HKEY_CURRENT_*USER*主键下写一个Software\test111子键,设置其名称为Name,类型为DWORD,值为6。

void OnBnClickedChange()
{
       HKEY hKey;//定义有关的hKEY,在查询结束时要关闭
       HKEY hTempKey;
       CString m_name = "China";
       LPBYTE m_name_Set = CString_To_LPBYTE(m_name);//定义x轴名称
       DWORD length = m_name.GetLength() + 1;//定义数据长度
       //打开与路径data_Set相关的hKEY
       LPCTSTR data_Set= _T("Software");
       if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, data_Set,0,KEY_SET_VALUE, &hKey))
       {
              // 使用hKey来操作data_Set这个KEY里面的值。
       if (ERROR_SUCCESS == RegCreateKey(hKey, _T("test"), &hTempKey))
              {
                     if (ERROR_SUCCESS != RegSetValueEx(hTempKey, _T("Name"), 0, REG_SZ, m_name_Set, length))
                     {
                            AfxMessageBox(_T("错误"));
                            ::RegCloseKey(hKey);
                            return;
                     }
              }
       }
       ::RegCloseKey(hKey);
   }

2.在HKEY_CURRENT_USER主键下写一个Software\test111子键,设置其名称为Name,类型为REG_SZ,值为China。

   void OnBnClickedChange()
     {
       HKEY hKey;//定义有关的hKEY,在查询结束时要关闭
       HKEY hTempKey;
       BYTE   m_name[10];
       memset(m_name, 0, sizeof(m_name));//将数组m_name清零
       m_name[0] = 0xff;
       m_name[1] = 0xac;
       m_name[2] = 0x05;
       m_name[4] = 0x4e;
       //打开与路径data_Set相关的hKEY
       LPCTSTR data_Set= _T("Software");
       if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, data_Set,0,KEY_SET_VALUE, &hKey))
       {
              // 使用hKey来操作data_Set这个KEY里面的值。
       if (ERROR_SUCCESS == RegCreateKey(hKey, _T("test"), &hTempKey))
              {
                   if (ERROR_SUCCESS != RegSetValueEx(hTempKey, _T("Name"), 0, REG_BINARY,(unsigned char *)m_name,5))
                     {
                            AfxMessageBox(_T("错误"));
                            ::RegCloseKey(hKey);
                            return;
                     }
              }
       }
       ::RegCloseKey(hKey);
    }

(3)删除注册表
1.删除HKEY_CURRENT_USER\Software\test111的键值Name

void OnBnClickedDelete()
{
       HKEY hKey;//定义有关的hKEY,在查询结束时要关闭
       //打开与路径data_Set相关的hKEY
       LPCTSTR data_Set= _T("Software\\test");```
      if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_CURRENT_USER, data_Set,0,KEY_SET_VALUE, &hKey))
       {
              // 使用hKey来操作data_Set这个KEY里面的值。
              if (ERROR_SUCCESS != RegDeleteValue(hKey, _T("Name")))
              {
                     AfxMessageBox(_T("错误"));
                     ::RegCloseKey(hKey);
                     return;
              }
       }
       ::RegCloseKey(hKey);
}

2.删除HKEY_CURRENT_USER\Software下的子键test111。

void OnBnClickedDelete()
{
       HKEY hKey;//定义有关的hKEY,在查询结束时要关闭
       //打开与路径data_Set相关的hKEY
       LPCTSTR data_Set= _T("Software");
       if (ERROR_SUCCESS == ::RegOpenKeyEx(HKEY_CURRENT_USER, data_Set,0,KEY_SET_VALUE, &hKey))
       {
              // 使用hKey来操作data_Set这个KEY里面的值。
              if (ERROR_SUCCESS != RegDeleteKey(hKey, "test"))
              {
                     AfxMessageBox(_T("错误"));
                     ::RegCloseKey(hKey);
                     return;
              }

       }
       ::RegCloseKey(hKey);
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值