\t\t孙鑫 第十二课之五 注册表编辑

1 说明

注册表编辑的函数有:打开,关闭,创建表项,

设定表项默认(无名)的值&&类型为REG_SZ(null结尾字符串)的数据

设定表项指定名称的值&&任意类型的数据

  孙鑫 第十二课之五 注册表编辑 - 大灰狼 - 大灰狼 的博客   孙鑫 第十二课之五 注册表编辑 - 大灰狼 - 大灰狼 的博客


2 创建

LONG RegCreateKey(

HKEY  hKey, // 注册表中的根目录, 例如HKEY_LOCAL_MACHINE。   handle to an open key

LPCTSTR   lpS Key,// 子目录以及表项名称,例如software\myProfile。    s key name 

PHKEY    phkResult// HEKY类型指针,以后用该指针标识该表项。 b?r for key handle 

);

eg.

HKEY  hKey;

RegCreateKey(HKEY_LOCAL_MACHINE,  "software\\myProfile", &hKey); //注意这里是两条斜杠

3  打开

这个函数有点类似RegCreateKey()函数。

LONG RegOpenKey(

HKEY  hKey, // 例如HKEY_LOCAL_MACHINE。handle to open key

LPCTSTR    lpS Key, //子目录以及表项名称,例如software\myProfile。 name of s key to open 

PHKEY    phkResult//  HEKY类型指针,以后用该指针标识该表项。handle to open key

 );

eg.

HKEY hKey;

RegOpenKey(HKEY_LOCAL_MACHINE, "software\\myProfile", &hKey);

 

4 关闭

LONG RegCloseKey( 

HKEY   hKey// RegCreateKey 或 RegOpenKey 执行后的hKey。  handle to key to close

);

eg.

RegCloseKey(hKey);

 

5 设定 表项默认(无名)的值&&类型为REG_SZ(null结尾字符串)的数据

LONG RegSetVal( 

HKEY   hKey,//如果是刚创建或已打开则用已有的句柄hKey,第二个参数为NULL。 或者像创建或打开那样为前两个参数赋值。

                    // handle to key 

LPCTSTR   lpS Key,// 根据第一个参数决定,如果为hKey则它为NULL,否则为子目录加表项。 s key name 

DWORD   dwType,// 必须为REG_SZ.   information type 

LPCTSTR   lpData,//要写入的字符的指针 val data 

DWORD   cbData//要写入的字节数,不包括'\0'。  size of val data

 );

eg.

①已经打开或刚创建的表项

RegSetVal(hKey, NULL, REG_SZ, "cuihaohao", (strlen("cuihaohao") ) * sizesof(char) );

②未打开而已存在的表项

RegSetVal(HKEY_LOCAL_MACHINE, "software\\url", REG_SZ, "www.baidu.com", strlen("www.baidu.com") * sizeof(char));

 

6 读取 默认(无名)的值&&类型为REG_SZ(null结尾字符串)的数据

LONG RegQryVal(

HKEY    hKey,//如果是刚创建或已打开则用已有的句柄hKey,第二个参数为NULL。 或者像创建或打开那样为前两个参数赋值。

                           // handle to key to qry 

LPCTSTR    lpS Key,//根据第一个参数决定,如果为hKey则它为NULL,否则为子目录加表项。 s key name 

LPTSTR    lpVal,// 要读入的缓冲区。 string b?r 

PLONG    lpcbVal// 读到或要读到的字符串大小,包含'\0'。 size of returned string 

);

NOTE: 如果lpVal为NULL,则lpcbVal也可以返回要读入的字符串大小,因此一般调用两次该函数,第一次lpVal为NULL,取得lpcbVal的值,然后为lpVal开辟一个大小正合适的内存空间,否则要为为lpVal开辟尽量大的空间,当空间不够时,lpcbVal返回需要的大小。    即:要么调用两次该函数获得正合适大小的空间,要么调用一次而给lpVal分配足够大的空间。

eg.

假设已经有打开或新建了的表项句柄hKey

char *ch = NULL;

LONG valLength = 0;

RegQryVal(hKey, NULL, NULL, &valLength); //返回的valLength的值为包含'\0'的字节数

ch = new char[ valLength / sizesof(char) ]; //  总字节数/单个字符字节 == 字符个数

RegQryVal(hKey,NULL, ch, &valLength);

MessageBox(ch);//  弹出读到的值

RegCloseKey(hKey);

delete ch; //释放ch指向的内存空间

ch = NULL; //避免野指针

 

7 设定 表项指定名称的值&&任意类型的数据

 LONG RegSetValEx( 

HKEY    hKey,// 已打开或刚新建的表项句柄 hKey。   handle to key 

LPCTSTR   lpValName,// 值名    val name 

DWORD    Reserved,// 保留 , 必须为0. reserved 

DWORD   dwType,// 值类型  val type 

CONST BYTE*   lpData,// 和值类型相关的数据  val data

DWORD    cbData// lpData所指向缓冲区的大小,字节,如果值类型是 REG_SZ, REG_EXPAND_SZ, or REG_MULTI_SZ(字符串类型)该大小包含结尾的'\0'

);

 eg.

HKEY hKey;

DWORD dwAge = 26;

char *name = "cuihao";

RegOpenKey(HKEY_LOCAL_MACHINE, "software\\myProfile", &hKey);

RegSetValEx(hKey, "age", 0, REG_DWORD /*整形*/, (CONST BYTE*)&dwAge, sizeof(dwAge) );

RegSetValEx(hKey, "name", 0, REG_SZ, (CONST BYTE*)name, (strlen(name) + 1) * sizeof(char) ); // "str(name) + 1"是加                                                                                                                                                                              //上末尾的'\0'                            

RegCloseKey(hKey); 

 

8 读取 表项指定名称的值&&指定类型的数据

 LONG RegQryValEx(

HKEY   hKey,//如果是刚创建或已打开则用已有的句柄hKey。  handle to key 

LPCTSTR   lpValName,//值名  val name 

LPDWORD   lpReserved,// 保留,必须为0. reserved 

LPDWORD   lpType,//[out],返回读入的值的类型。  type b?r 

LPBYTE   lpData,// 读入的内容写入该缓冲区,缓冲区的类型要根据值类型不同而不同。 data b?r 

LPDWORD   lpcbData//[in / out] 读入的内容的大小,字节,如果是  REG_SZ, REG_EXPAND_SZ, or REG_MULTI_SZ(字符串类型) 该大小包含结尾的'\0'。size of data b?r  

);

NOTE:和RegQryVal()类似,如果lpData为NULL,而lpcbData不为空,则lpcbData返回字节单位的读到的内容的大小。

如果lpData空间不够大,会返回一个ERROR_S?SS错误,同时lpcbData返回需要的空间大小。 所以,要么调用两次以获得正合适大小的空间;要么调用一次该函数,前提是分配足够大的空间。

当lpValName为NULL或者空字符串("")时,读的是默认(无名)的值的数据。


eg.

①读默认(无名)的值的数据

//读默认值//

DWORD defaultType = 0;

char *defaultData = new char[20];   //假设20足够大

memset(defaultData, 0, 20);

DWORD defaultLength = 20;

::RegQryValEx(hKey, NULL, 0, &defaultType, (LPBYTE)defaultData, &defaultLength); 

MessageBox(defaultData);

RegCloseKey(hKey);

delete defaultData;

defaultData = NULL;

 

 ②读取指定值名的数据

HKEY hKey;

::RegOpenKey(HKEY_LOCAL_MACHINE, "software\\myProfile", &hKey);

 

///读年龄

DWORD dwType = 0;

DWORD data = 0;

DWORD cbData = sizeof(DWORD);

::RegQryValEx(hKey, "age", 0, &dwType, (LPBYTE)&data, &cbData);

CString str;

str.Format("age=%d", data);

//MessageBox(str);

 

读名字//

char *nameB?r = NULL;

DWORD nameType = 0;

DWORD nameLength = 0;

::RegQryValEx(hKey, "name", 0, &nameType, NULL, &nameLength); //先得到nameLength的合适大小,单位字节,从而                                                                                  // 为nameB?r分配合适大小空间                                                  

nameB?r = new char[nameLength / sizeof(char)];

::RegQryValEx(hKey, "name", 0, &nameType, (LPBYTE)nameB?r, &nameLength);

//MessageBox(nameB?r);

 

 //清理

RegCloseKey(hKey);

delete nameB?r;

nameB?r = NULL;



   孙鑫 第十二课之五 注册表编辑 - 大灰狼 - 大灰狼 的博客?

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值