现在的位置: 首页 > 综合 > 正文

注册表操作(VC_Win32)

2018年07月07日 ⁄ 综合 ⁄ 共 4360字 ⁄ 字号 评论关闭

转载 原文 http://www.cnblogs.com/kzloser/archive/2012/11/07/2758404.html

注册表操作(VC_Win32)

目录

注册表概述
注册表相关函数详解
注册表编程

(本章节中例子都是用 VS2005 编译调试的)


注册表概述

概述

注册表是windows操作系统中的一个核心数据库,其中存放着各种参数,直接控制着windows的启动、硬件驱动程序的装载以及一些windows应用程序的运行,从而在整个系统中起着核心作用.这些作用包括了软、硬件的相关配置和状态信息,比如注册表中保存有应用程序和资源管理器外壳的初始条件、首选项和卸载数据等,联网计算机的整个系统的设置和各种许可,文件扩展名与应用程序的关联,硬件部件的描述、状态和属性,性能记录和其他底层的系统状态信息,以及其他数据等.

数据结构

注册表由键(或称"项")、子键(子项)和值项构成.一个键就是分支中的一个文件夹,而子键就是这个文件夹中的子文件夹,子键同样是一个键.一个值项则是一个键的当前定义,由名称、数据类型以及分配的值组成.一个键可以有一个或多个值,每个值的名称各不相同,如果一个值的名称为空,则该值为该键的默认值.

数据类型

注册表的数据类型主要有以下四种:
显示类型(在编辑器中)  

数据类型   
 说明                   

REG_SZ          字符串     文本字符串

REG_MULTI_SZ       多字符串    含有多个文本值的字符串

REG_BINARY         二进制数    二进制值,以十六进制显示.

REG_DWORD        双字      一个32位的二进制值,显示为8位的十六进制值.

各主键的简单介绍

  • HKEY_LOCAL_MACHINE  是一个显示控制系统和软件的处理键.HKLM键保存着计算机的系统信息.它包括网络和硬件上所有的软件设置.
  • HKEY_CLASSES_ROOT  是系统中控制所有数据文件的项.
  • HKEY_USERS  将缺省用户和目前登陆用户的信息输入到注册表编辑器
  • HKEY_CURRENT_USER  包含着在HKEY_USERS安全辨别里列出的同样信息
  • HKEY_CURRENT_CONFIG  包括了系统中现有的所有配置文件的细节.HKEY_CURRENT_CONFIG允许软件和设备驱动程序员很方便的更新注册表,而不涉及到多个配置文件信息. HKEY_LOCAL_MACHINE中同样的数据和任何注册表的变化都会同时的变化.

相关函数

复制代码

[创建键][打开键][删除键][添加/修改键值][删除键值][读取键值]

创建键 RegCreateKeyEx

函数原型

LONG RegCreateKeyEx(
  HKEY hKey,                                  // handle to open key
  LPCTSTR lpSubKey,                           // subkey name
  DWORD Reserved,                             // reserved
  LPTSTR lpClass,                             // class string
  DWORD dwOptions,                            // special options
  REGSAM samDesired,                          // desired security access
  LPSECURITY_ATTRIBUTES lpSecurityAttributes, // inheritance
  PHKEY phkResult,                            // key handle 
  LPDWORD lpdwDisposition                     // disposition value buffer
);

参数说明

  • hKey:   要打开键的句柄或以下预定义句柄

    • HKEY_CLASSES_ROOT
    • HKEY_CURRENT_USER
    • HKEY_LOCAL_MACHINE
    • HKEY_USERS
  • lpSubKey:   指向一个用于定义子键路径的字符串
  • Reserved,dwOptions,samDesired:   置0
  • lpClass,lpSecurityAttributes:   置NULL
  • phkResult:   用于接收键句柄
  • lpdwDisposition:   接收的相关信息,取值如下

    • REG_CREATED_NEW_KEY   创建成功
    • REG_OPENED_EXISTING_KEY    键已存在

打开键 RegOpenKeyEx

函数原型

LONG RegOpenKeyEx(
  HKEY hKey,         // handle to open key
  LPCTSTR lpSubKey,  // subkey name
  DWORD ulOptions,   // reserved
  REGSAM samDesired, // security access mask
  PHKEY phkResult    // handle to open key
);

参数说明

  • hKey:     要打开键的句柄或以下预定义句柄

    • HKEY_CLASSES_ROOT
    • HKEY_CURRENT_USER
    • HKEY_LOCAL_MACHINE
    • HKEY_USERS
  • lpSubKey:   指向一个用于定义子键路径的字符串
  • ulOptions:   保留位,置0
  • samDesired:   打开键后键的操作权限
  • phResult:   接收打开的键的句柄

删除键 RegDeleteKey

函数原型

LONG RegDeleteKey(
  HKEY hKey,         // handle to open key
  LPCTSTR lpSubKey   // subkey name
);

参数说明

  • hKey:   要打开键的句柄或以下预定义句柄

    • HKEY_CLASSES_ROOT
    • HKEY_CURRENT_USER
    • HKEY_LOCAL_MACHINE
    • HKEY_USERS
  • lpSubKey:   指向一个用于定义子键路径的字符串

修改/添加键值 RegSetValueEx

函数原型

LONG RegSetValueEx(
  HKEY hKey,           // handle to key
  LPCTSTR lpValueName, // value name
  DWORD Reserved,      // reserved
  DWORD dwType,        // value type
  CONST BYTE *lpData,  // value data
  DWORD cbData         // size of value data
);

参数说明

  • hKey:   打开键的句柄或以下预定义句柄

    • HKEY_CLASSES_ROOT
    • HKEY_CURRENT_USER
    • HKEY_LOCAL_MACHINE
    • HKEY_USERS
  • lpValueName:   键值的名称
  • Reserved:   保留位,置0
  • dwType:   键值的类型
  • lpData:   键值
  • cbData:   键值数据长度

删除键值 RegDeleteValue

函数原型

LONG RegDeleteValue(
  HKEY hKey,            // handle to key
  LPCTSTR lpValueName   // value name
);

参数说明

  • hKey:   打开键的句柄或以下预定义句柄

    • HKEY_CLASSES_ROOT
    • HKEY_CURRENT_USER
    • HKEY_LOCAL_MACHINE
    • HKEY_USERS
  • lpValueName:   键值的名称

读取键值 RegQueryValueEx

函数原型

LONG RegQueryValueEx(
  HKEY hKey,            // handle to key
  LPCTSTR lpValueName,  // value name
  LPDWORD lpReserved,   // reserved
  LPDWORD lpType,       // type buffer
  LPBYTE lpData,        // data buffer
  LPDWORD lpcbData      // size of data buffer
);

参数说明

 

  • hKey:   打开键的句柄或以下预定义句柄

    • HKEY_CLASSES_ROOT
    • HKEY_CURRENT_USER
    • HKEY_LOCAL_MACHINE
    • HKEY_USERS
  • lpValueName:   键值的名称
  • Reserved:   保留位,置0
  • lpType:   接收键值的类型
  • lpData:   接收键值
  • lpcbData:   接收键值数据长度
复制代码

相关文献: RegSetValueEx用法 


注册表编程(利用注册表写开机启动程序)

执行流程

代码样例

创建键

程序源码:(链接)

运行结果:

删除键

程序源码:(链接)

运行结果:

修改/创建键值

程序源码:(链接)

运行结果:

读取键值

程序源码:(链接)

运行结果(读取"test"键值):

删除键值

程序源码:(链接)

运行结果:

程序源码

View
Code

 

利用注册表写开机启动程序

说明:

通过向注册表 HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run 中添加键值来让程序在开机时被系统加载.

步骤:

  • 设置开机启动

      
  • 取消开机启动

      

程序源码:

复制代码
//这里用的是宽字符,既 wchar_t

if(isStartOpen)
{
    //开机启动
    HKEY hKey;     
    LPCTSTR lpRun = L"Software\\Microsoft\\Windows\\CurrentVersion\\Run"; 
    //---------------找到系统的启动项 
    long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);
    //-----------打开启动项Key  
    if(lRet == ERROR_SUCCESS) 
    { 
        wchar_t pFileName[MAX_PATH] = {0}; 
        DWORD dwRet = GetModuleFileName(NULL, pFileName, MAX_PATH);
        //----------------得到程序自身的全路径 
        lRet = RegSetValueEx(hKey, L"DeskPro",0,REG_SZ,(BYTE *)pFileName,dwRet*2);
        //----------------添加或者修改注册表项
        RegCloseKey(hKey);
        //----------------关闭注册表
    }
}    
else
{
    //取消卡机启动
    HKEY hKey;     
    LPCTSTR lpRun = L"Software\\Microsoft\\Windows\\CurrentVersion\\Run"; 
    //---------------找到系统的启动项 
    long lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpRun, 0, KEY_WRITE, &hKey);
    if(lRet==ERROR_SUCCESS)
    {
        RegDeleteValue(hKey,L"DeskPro");
        //----------------删除注册表项
        RegCloseKey(hKey);
        //----------------关闭注册表
    }
}
复制代码

抱歉!评论已关闭.