WindowsAPI--注册表信息

@part 3 注册表

1.注册表的作用及组织形式

Windows系统使用注册表来存储系统和应用程序配置数据。

注册表是一种以树形结构组织的数据库。树的每一个节点称作键,每个节点可以包含若干子键,键可以存储数据,存储的数据称作键值。

注册表键值类型

REG_BINARY  |   任何形式的二进制数据

REG_DWORD   |   32位数据

REG_DWORD_LITTLE_ENDIAN   |  little-endian形式存储的32位数据

REG_DWORD_BIG_ENDIAN   |  big-endian形式存储的32位数据

REG_EXPAND_SZ  |  NULL结尾的字符串,可以使用环境变量,如%PATH%

REG_LINK    |   只能由操作系统使用的类型

REG_MULTI_SZ   |  字符串数组,以NULL结束字符串,以两个NULL结束数组

REG_NONE    |   未定义的数据类型

REG_QWORD   |  64位数据

REG_QWORD_LITTLE_ENDIAN   |  little-endian形式存储的64位数据

REG_SZ     | 字符串,以NULL结束

2.键、子键、键属性及键值的相关操作

(1)原理

在对注册表操作之前,需要使用API函数RegOpenKey,RegOpenKeyEx打开键。在打开键后如果需要创建新的键,使用API函数RegCreateKey,RegCreateKeyEx.这两组函数都将返回键的句柄(HKEY).

(2)关键API和数据结构

LSTATUS APIENTRY RegOpenKeyExA (

    HKEY hKey,

    LPCSTR lpSubKey,

    DWORD ulOptions,

    REGSAM samDesired,

    PHKEY phkResult

    );

LSTATUS APIENTRY  RegCreateKeyA (

    HKEY hKey,

    LPCSTR lpSubKey,

    PHKEY phkResult

    );

LSTATUS APIENTRY RegSetValueExA (

    HKEY hKey,

    LPCSTR lpValueName,

    DWORD Reserved,

    DWORD dwType,

    CONST BYTElpData,

    DWORD cbData

    );

typedef HKEY *PHKEY;

(3)测试实例

    HKEY hTestKey;

HKEY hSubKey;

DWORD dwKeyValue = 100;

if (RegOpenKeyEx(HKEY_CURRENT_USER,

TEXT("SOFTWARE"),

0,KEY_READ | KEY_WRITE,&hTestKey) == ERROR_SUCCESS)

{

RegCreateKey(hTestKey,"MyTestSoftWare",&hSubKey);

if (RegSetValueEx(hSubKey,"Test",NULL,REG_DWORD,

&dwKeyValue,sizeof(DWORD)) != ERROR_SUCCESS)

{

cout<<"RegSetValue Error!"<<endl;

}

}

@problem

错误 1 error C2664: “RegSetValueExA”: 不能将参数 “DWORD *”转换为“const BYTE *” f:\debug\sysmsg\sysmsg\getsysinfo.cpp 85

解决办法:

强制转换:(const BYTE *)&dwKeyValue

@display:


3.列举注册表项及键值

(1)原理

使用API函数RegEnumKeyEx,RegEnumValue.RegQueryInfoKey,RegEnumKeyEx,RegEnumValue相配合可以完成对一个键值的所有子键及键值的列举

(2)关键API和和数据结构

LSTATUS APIENTRY RegQueryInfoKeyA (

    HKEY hKey,

    LPSTR lpClass,

    LPDWORD lpcchClass,

    LPDWORD lpReserved,

    LPDWORD lpcSubKeys,

    LPDWORD lpcbMaxSubKeyLen,

    LPDWORD lpcbMaxClassLen,

    LPDWORD lpcValues,

    LPDWORD lpcbMaxValueNameLen,

    LPDWORD lpcbMaxValueLen,

    LPDWORD lpcbSecurityDescriptor,

    __out_opt PFILETIME lpftLastWriteTime

    );

LSTATUS APIENTRY RegEnumKeyExA (

    HKEY hKey,

    DWORD dwIndex,

    LPSTR lpName,

    LPDWORD lpcchName,

    LPDWORD lpReserved,

    LPSTR lpClass,

    LPDWORD lpcchClass,

    PFILETIME lpftLastWriteTime

    );

LSTATUS APIENTRY RegEnumValueA (

    HKEY hKey,

    DWORD dwIndex,

    LPSTR lpValueName,

    LPDWORD lpcchValueName,

    LPDWORD lpReserved,

    LPDWORD lpType,

     LPBYTE lpData,

    LPDWORD lpcbData

    );

4.通过注册表设置一个自启动的程序

(1)原理

设置HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\RunREG_SZ类型的键值

(2)测试实例

@source code

    HKEY hTestKey;

TCHAR dwKeyValue[MAX_PATH] = "G:\\Notepad++\\Notepad++.exe";

if (RegOpenKeyEx(HKEY_LOCAL_MACHINE,

TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run"),

0,KEY_READ | KEY_WRITE,&hTestKey) == ERROR_SUCCESS)

{

if (RegSetValueEx(hTestKey,"Test",NULL,REG_SZ,

(const BYTE *)dwKeyValue,MAX_PATH) != ERROR_SUCCESS)

{

cout<<"RegSetValue Error!"<<endl;

}

}

@display


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值