找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 156|回复: 0

C++操作注册表

[复制链接]

1

主题

0

回帖

37

积分

管理员

积分
37
发表于 2024-5-2 22:36:54 | 显示全部楼层 |阅读模式
  1. 一、注册表
  2. 1.简介
  3. 注册表(Registry,繁体中文版Windows操作系统称之为登录档)是Microsoft Windows中的一个重要的数据库,用于存储系统和应用程序的设置信息。早在Windows 3.0推出OLE技术的时候,注册表就已经出现。随后推出的Windows NT是第一个从系统级别广泛使用注册表的操作系统。但是,从Microsoft Windows 95操作系统开始,注册表才真正成为Windows用户经常接触的内容,并在其后的操作系统中继续沿用至今。
  4. 2.注册表权限修改:
  5. 1):在运行对话框中输入:regedit,点击确定或按回车键(Enter),打开注册表编辑器,在注册表编辑器窗口,左键单击:HKEY采用CURRENT采用USER,再点击:编辑-权限。
  6. 2):此时,打开了HKEY采用CURRENT采用USER的权限对话框,在这个对话框中,先查看本机登录的用户名,如组或用户名(G)栏中没有,点击:高级选项。
  7. 3):在打开的HKEY采用CURRENT采用USER的高级安全设置窗口,点击:添加。
  8. 4):在HKEY采用CURRENT采用USER的高级安全设置窗口,点击添加以后,就会打开HKEY采用CURRENT采用USER的权限项目窗口,在这个窗口中,基本权限项都呈灰色状态不可选择,点击:选择主体。
  9. 5):在打开的选择用户和组对话框中,点击:高级。
  10. 6):按下来,在对话框中点击:立即查找(N)在搜索结果(U)栏中用鼠标按住右侧的小滑块向下拖动,找到本机登录的用户名如:GONG ZOU,并左键单击用户名,再点击:确定。
  11. 7):点击确定以后,可以看到本机登录用户名显示在检查名称栏中,点击:确定。
  12. 8):这时就会回到HKEY采用CURRENT采用USER的高级安全设置窗口,在这个窗口,点击:显示高级权限,在HKEY采用CURRENT采用USER的权限项目窗口的高级权限下,点击完全控制,再点击确定。
  13. 9):回到HKEY采用CURRENT采用USER的高级安全设置窗口,点击:应用-确定。
  14. 10):回到HKEY采用CURRENT采用USER的权限窗口,点击:确定,退出注册表编辑器。
  15. 二、相关函数
  16. 1、RegCloseKey()
  17.   原型:RegCloseKey(HKEY hKey)
  18.   解释:关闭指定的主册表键,释放句柄。当对一个或多个键或值操作完成以后,需要关闭其键来进行保存操作结果,关闭一个键后,句柄变为非法,此时应释放句柄。
  19.   2、RegCreateKeyEx()
  20.   原型:LONG RegCreateKeyEx( HKEY hKey, LPCTSTR lpSubKey, DWORD Reserved,
  21. LPTSTR lpClass, DWORD dwOptions, REGSAM samDesired, LPSECURITY采用ATTRIBUTES lpSecurityAttributes,
  22. PHKEY phkResult, LPDWORD lpdwDisposition );
  23.   解释:打开指定的键或子键。如果要打开的键不存在的话,本函数会试图建立它。提供该函数是为了向后兼容。所有的WIN32应用程序应使用函数RegCreateKeyEx()。各参数及返回值的含义如下:
  24.   各参数及返回值的含义如下:
  25.   ·hKey为主键值,可以取下面的一些数值:HKEY采用CLASSES采用ROOT、HKEY采用CURRENT采用CONFIG、  HKEY采用CURRENT采用USER、HKEY采用LOCAL采用MACHINE、HKEY采用USER、HKEY采用PERFORMANCE采用DATA(WINNT操作系统)、HKEY采用DYN采用DATA(WIN9X操作系统);
  26.   ·参数lpSubKey为一个指向以零结尾的字符串的指针,其中包含将要创建或打开的子键的名称。子键不可以用反斜线(\)开始。该参数可以为NULL;
  27.   ·参数Reserved为保留值,必须设置为0;
  28.   ·参数lpClass为一个指向包含键类型的字符串。如果该键已经存在,则忽略该参数;
  29.   ·参数dwOptions为新创建的键设置一定的属性。可以取下面的一些数值:  REG采用OPTION采用NON采用VOLATILE ,表示新创建的键为一个非短暂性的键(数据信息保存在文件中,当系统重新启动时,数据信息恢复);REG采用OPTION采用VOLATILE,表示新创建的键为一个短暂性的键(数据信息保存在内存中),Windows95忽略该数值;REG采用OPTION采用BACKUP采用RESTORE 仅在WINNT中支持,可以提供优先级支持;
  30.   ·参数samDesired用来设置对键访问的权限,可以取下面的一些数值:KEY采用CREATE采用LINK,表示准许生成符号键;KEY采用CREATE采用SUB采用KEY 表示准许生成子键;KEY采用ENUMERATE采用SUB采用KEYS 表示准许生成枚举子键;KEY采用EXECUTE 表示准许进行读操作;KEY采用NOTIFY表示准许更换通告;   KEY采用QUERY采用VALUE 表示准许查询子键;KEY采用ALL采用ACCESS 提供完全访问,是上面数值的组合;
  31.   KEY采用READ 是下面数值的组合:KEY采用QUERY采用VALUE、KEY采用ENUMERATE采用SUB采用KEYS、KEY采用NOTIFY;  KEY采用SET采用VALUE 表示准许设置子键的数值;KEY采用WRITE 是下面数值的组合:KEY采用SET采用VALUE、KEY采用CREATE采用SUB采用KEY;
  32.   ·参数lpSecurityAttributes为一个指向SECURITY采用ATTRIBUTES结构的指针,确定返回的句柄是否被子处理过程继承。如果该参数为NULL,则句柄不可以被继承。在WINNT中,该参数可以为新创建的键增加安全的描述;
  33.   ·参数phkResult为一个指向新创建或打开的键的句柄的指针;
  34.   ·参数lpdwDispition指明键是被创建还是被打开的,可以是下面的一些数值:  REG采用CREATE采用NEW采用KEY 表示键先前不存在,现在被创建;REG采用OPENED采用EXISTING采用KEY 表示键先前已存在,现在被打开。
  35.   如果该函数调用成功,则返回ERROR采用SUCCESS。否则,返回值为文件WINERROR.h中定义的一个非零的错误代码,可以通过设置FORMAT采用MESSAGE采用FROM采用SYSTEM标识调用FormatMessage()函数来获取一个对错误的总体描述。
  36.   3、RegOpenKeyEx()
  37.   原型:LONG RegOpenKeyEx(HKEY hKey, LPCTSTR lpSubKey, DWORD ulOptions,
  38. REGSAM samDesired, PHKEY phkResult );
  39.   解释:打开一个指定的键,并返回打开键的句柄。
  40.   各参数及返回值的含义如下:
  41.   ·参数hKey的含义同RegCreateKeyEx函数中的hKey参数;
  42.   ·参数lpSubKey为一个指向以零结尾的字符串的指针,其中包含子键的名称,可以利用反斜线(\)分隔不同的子键名。如果字符串为空,则根据hKey参数创建一个新的句柄。在这种情况下,并不关闭先前打开的句柄;
  43.   ·参数ulOption保留,通常必须设置为0;
  44.   ·参数samDesired的含义同RegCreateKeyEx函数中的samDesired参数;
  45.   ·参数phkResult为一个指针,用来指向打开的键的句柄。可以通过RegCloseKey函数关闭这个句柄;
  46.   ·函数的返回值同RegCreateKeyEx函数的返回值。
  47.   4、 查询某一个键值:RegQueryValueEx()
  48.   原型:LONG RegQueryValueEx(HKEY hKey, LPCTSTR lpValueName, LPDWORD pReserved, LPDWORD lpType,
  49. LPBYTE lpData, LPDWORD lpcbData );
  50.   解释:根据要查询的键的句柄,要返回的查询的数据。
  51.   各个参数及返回值的含义如下:
  52.   ·参数hKey为当前的一个打开的键的句柄,具体数值同RegCreateKeyEx函数的hKey参数;
  53.   ·参数lpVauleName为一个指向非空的包含查询值的名称的字符串指针;
  54.   ·参数lpReserved保留,必须为NULL;
  55.   ·参数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类型的字符串;
  56.   ·参数lpData为一个指向保存返回值的变量的指针。如果不需要返回值,该参数可以为NULL;
  57.   ·参数lpcbData为一个指向保存返回值长度的变量的指针。其中长度以字节为单位。如果数据类型为REG采用SZ、REG采用MULTI采用SZ或REG采用EXPAND采用SZ,那么长度也包括结尾的零字符,只有在参数lpData为NULL时,参数lpcbData才可以为NULL;返回值同RegCreateKeyEx函数的返回值;
  58.   5、RegSetValueEx()
  59.   原型:LONG RegSetValueEx(HKEY hKey, LPCTSTR lpValueName, LPDWORD lpReserved, DWORD dwType,
  60. const BYTE *lpData, DWORD cbData);
  61.   解释:设置注册表中的一个键值。
  62.   各个参数及返回值的含义如下:
  63.   ·参数hKey的含义同RegCreateKeyEx函数中的hKey参数;
  64.   ·参数lpValueName为一个指向包含值名的字符串指针;Reserved保留,通常必须设置为0;
  65.   ·参数dwType确定了设置的值的类型同RegQueryValueKeyEx的lyType参数;
  66.   ·参数lpData为一个指向包含数据的缓冲区的指针;
  67.   ·参数cbData以字节为单位,指定数据的长度;
  68.   返回值同RegCreateKeyEx函数的返回值。
  69.   6、RegDeketeKey()
  70.   原型:LONG RegDeleteKey(HKEY hKey,LPCTSTR lpSubKEY);
  71.   解释:函数RegDeketeKey删除一个键及所有的子键。
  72.   各个参数及返回值的含义如下:
  73.   ·参数hKey的含义同RegCreateKeyEx函数中的hKey参数;
  74.   ·参数lpSubKey的含义同RegCreateKeyEx函数中的lpSubKey参数。 
  75. 3. 实例
  76. (1)读取注册表
  77. 1.查看HKEY采用CURRENT采用USER主键下Software\Microsoft\FTH子键中名称为TicketValue的值,其类型为DWORD。
  78. void  OnBnClickedQuery()
  79. {
  80.     HKEY hKEY;//定义有关的hKEY,在查询结束时要关闭
  81.     //打开与路径data采用Set相关的hKEY
  82.     LPCTSTR data采用Set= 采用T("Software\\Microsoft\\FTH");
  83.     //访问注册表,hKEY则保存此函数所打开的键的句柄
  84. if(ERROR采用SUCCESS==RegOpenKeyEx(HKEY采用CURRENT采用USER,data采用Set,0,KEY采用READ,&hKEY))
  85.     {
  86.               DWORD dwValue;
  87.               DWORD dwSize = sizeof(DWORD);
  88.               DWORD dwType = REG采用DWORD;
  89.               if (::RegQueryValueEx(hKEY,采用T("GridProgressColumnIndex"), 0, &dwType, (LPBYTE)&dwValue, &dwSize) != ERROR采用SUCCESS)
  90.                   {
  91.                          AfxMessageBox(采用T("错误:无法查询有关的注册表信息"));
  92.                   }
  93.            //程序结束,关闭打开的hKEY
  94.            ::RegCloseKey(hKEY);
  95.     }
  96. }
  97. 可以看到读取的注册表TicketValue的值是正确的。
  98. 2.查看HKEY采用LOCAL采用MACHINE主键下SOFTWARE\Microsoft\Windows NT\CurrentVersion子键中名称为”SoftwareType的值,其类型为REG采用SZ。
  99. void OnBnClickedQuery()
  100. {
  101.        HKEY hKEY;//定义有关的hKEY,在查询结束时要关闭
  102.        //打开与路径data采用Set相关的hKEY
  103.        LPCTSTR data采用Set= 采用T("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion");
  104.        //访问注册表,hKEY则保存此函数所打开的键的句柄
  105.        if (ERROR采用SUCCESS ==RegOpenKeyEx(HKEY采用LOCAL采用MACHINE,data采用Set,0,KEY采用READ,&hKEY))
  106.        {
  107.             char dwValue[256];
  108.             DWORD dwSzType = REG采用SZ;
  109.             DWORD dwSize = sizeof(dwValue);
  110.            if (RegQueryValueEx(hKEY,采用T("SoftwareType"), 0, &dwSzType, (LPBYTE)&dwValue, &dwSize) != ERROR采用SUCCESS)
  111.               {
  112.                    AfxMessageBox(采用T("错误:无法查询有关的注册表信息"));
  113.               }
  114.               //程序结束,关闭打开的hKEY
  115.               ::RegCloseKey(hKEY);
  116.        }
  117. }
  118. (2)写注册表
  119. 1.在HKEY采用CURRENT采用*USER*主键下写一个Software\test111子键,设置其名称为Name,类型为DWORD,值为6。
  120. void OnBnClickedChange()
  121. {
  122.        HKEY hKey;//定义有关的hKEY,在查询结束时要关闭
  123.        HKEY hTempKey;
  124.        CString m采用name = "China";
  125.        LPBYTE m采用name采用Set = CString采用To采用LPBYTE(m采用name);//定义x轴名称
  126.        DWORD length = m采用name.GetLength() + 1;//定义数据长度
  127.        //打开与路径data采用Set相关的hKEY
  128.        LPCTSTR data采用Set= 采用T("Software");
  129.        if (ERROR采用SUCCESS == ::RegOpenKeyEx(HKEY采用CURRENT采用USER, data采用Set,0,KEY采用SET采用VALUE, &hKey))
  130.        {
  131.               // 使用hKey来操作data采用Set这个KEY里面的值。
  132.        if (ERROR采用SUCCESS == RegCreateKey(hKey, 采用T("test"), &hTempKey))
  133.               {
  134.                      if (ERROR采用SUCCESS != RegSetValueEx(hTempKey, 采用T("Name"), 0, REG采用SZ, m采用name采用Set, length))
  135.                      {
  136.                             AfxMessageBox(采用T("错误"));
  137.                             ::RegCloseKey(hKey);
  138.                             return;
  139.                      }
  140.               }
  141.        }
  142.        ::RegCloseKey(hKey);
  143.    }
  144. 2.在HKEY采用CURRENT采用USER主键下写一个Software\test111子键,设置其名称为Name,类型为REG采用SZ,值为China。
  145.    void OnBnClickedChange()
  146.      {
  147.        HKEY hKey;//定义有关的hKEY,在查询结束时要关闭
  148.        HKEY hTempKey;
  149.        BYTE   m采用name[10];
  150.        memset(m采用name, 0, sizeof(m采用name));//将数组m采用name清零
  151.        m采用name[0] = 0xff;
  152.        m采用name[1] = 0xac;
  153.        m采用name[2] = 0x05;
  154.        m采用name[4] = 0x4e;
  155.        //打开与路径data采用Set相关的hKEY
  156.        LPCTSTR data采用Set= 采用T("Software");
  157.        if (ERROR采用SUCCESS == ::RegOpenKeyEx(HKEY采用CURRENT采用USER, data采用Set,0,KEY采用SET采用VALUE, &hKey))
  158.        {
  159.               // 使用hKey来操作data采用Set这个KEY里面的值。
  160.        if (ERROR采用SUCCESS == RegCreateKey(hKey, 采用T("test"), &hTempKey))
  161.               {
  162.                    if (ERROR采用SUCCESS != RegSetValueEx(hTempKey, 采用T("Name"), 0, REG采用BINARY,(unsigned char *)m采用name,5))
  163.                      {
  164.                             AfxMessageBox(采用T("错误"));
  165.                             ::RegCloseKey(hKey);
  166.                             return;
  167.                      }
  168.               }
  169.        }
  170.        ::RegCloseKey(hKey);
  171.     }
  172. (3)删除注册表
  173. 1.删除HKEY采用CURRENT采用USER\Software\test111的键值Name
  174. void OnBnClickedDelete()
  175. {
  176.        HKEY hKey;//定义有关的hKEY,在查询结束时要关闭
  177.        //打开与路径data采用Set相关的hKEY
  178.        LPCTSTR data采用Set= 采用T("Software\\test");```
  179.       if (ERROR采用SUCCESS == RegOpenKeyEx(HKEY采用CURRENT采用USER, data采用Set,0,KEY采用SET采用VALUE, &hKey))
  180.        {
  181.               // 使用hKey来操作data采用Set这个KEY里面的值。
  182.               if (ERROR采用SUCCESS != RegDeleteValue(hKey, 采用T("Name")))
  183.               {
  184.                      AfxMessageBox(采用T("错误"));
  185.                      ::RegCloseKey(hKey);
  186.                      return;
  187.               }
  188.        }
  189.        ::RegCloseKey(hKey);
  190. }
  191. 2.删除HKEY采用CURRENT采用USER\Software下的子键test111。
  192. void OnBnClickedDelete()
  193. {
  194.        HKEY hKey;//定义有关的hKEY,在查询结束时要关闭
  195.        //打开与路径data采用Set相关的hKEY
  196.        LPCTSTR data采用Set= 采用T("Software");
  197.        if (ERROR采用SUCCESS == ::RegOpenKeyEx(HKEY采用CURRENT采用USER, data采用Set,0,KEY采用SET采用VALUE, &hKey))
  198.        {
  199.               // 使用hKey来操作data采用Set这个KEY里面的值。
  200.               if (ERROR采用SUCCESS != RegDeleteKey(hKey, "test"))
  201.               {
  202.                      AfxMessageBox(采用T("错误"));
  203.                      ::RegCloseKey(hKey);
  204.                      return;
  205.               }
  206.        }
  207.        ::RegCloseKey(hKey);
  208. }
复制代码
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|膜结构网

GMT+8, 2025-1-4 13:26 , Processed in 0.096233 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表