📄 12.7.2 注册表访问示例及本章小结.txt
字号:
12.7.2 注册表访问示例
下面,我们就在File程序中实现对注册表的访问。先将CFileApp类的lnitInstance函数中先前添加
的代码(即如例 12-26所示代码)注释起来,然后为File程序的文件操作子菜单再增加两个菜单项,
井为CFileView类增加这两个菜单项的命令消息响应,其E、名称,以及响应函数名如表12.13所示。
表12.13为注册表操作增加的菜单项
写注册表 读注册表 菜单项名称 ID IDM REG WRITE IDM_REG_READ OnRegWrite OnRegRead 响
应函数
~...... 1477
第12章首先,我们在 OnRegWrite函数中添加写注册表操作的实现代码,结果如例 12-27所示。侈IJ
12-27
1. void CFi1eView : :OnRegWrite()
2. {
3. // TODO : Add your command handler code here
4. HKEY hKey;
5. RegCreateKey(HKEY_LOCAL_MACHINE , "Software\\http: //www.sunxin.org\\admi n" , &hKey) ;
6. RegSetValue (hKey , NULL , REG_SZ , "zhangsan" , strlen ("zhangsan")) ;
7. RegCloseKey(hKey) ;
8. }
在如例 12-27所示的代码中,首先定义了一个注册表项句柄变量:hkey,接着调用 RegCreateKey函
数创建一个注册表项。这里需要提醒读者注意的是,在向注册表中写入软件信息时,通常都是在
EKEY-LOCAL-MACEmE分支下写入的。 RegCreateKey函数的第二个参数是指定注册表项的子工页,本
例是: So丘ware\http://www.sunxin.org\admin。
接下来,就利用 RegSetValue函数设置注册表项的值,本例是设置指定项的默认或者没有名字的值
的数据,将其值设置为字符串类型的"zhangsan "。最后,当不再需要访问注册表项时,调用
RegCloseKey函数关闭相应的注册表项句
柄。
运行File程序,单击【文件操作\写注册表】菜单项。然后打开注册表编辑器,将可
以看到 HKEY_LOCAL_MACHINE\Software分支下多了一个注册表项: http://www.
suruin-org。打开该项,将可以看到其下还有一个子项: admin,并且可以看到程序为该子项写入的
默认值的数据是: zhangsan,值的类型为 REG SZ,即字符串类型,如图 12.19所示。
!rII注翩翩嚣明l
注册'阳~董着ω收回阳f),阴阳
,飞 CNNIC
自口Creel:阴 Tech
REG sz 由西咱.onE巳Crystel国d制盲白白Descr~1on I
Ll DivX~院:G . 1
囱{臼惜W剧-p配:I<.ord
白白http:/阳恻SU1Xin叫
臼Ir回翩翩
.
图 12.19向注册表中写六字符串类型的值
接下来,我们在 File程序中添加代码以读取刚才写入注册表的数据,这时可以在 OnRegRead函数中
添加如例 12-28所示的实现代码。
,
478 I ~~
vc忡深λ详解
1JIJ 12-28
void CFileV工ew: :OnRegRead ( )
11 TODO : Add your command handler code here
LONG lValue;
RegQueryValue(HKEY_ LOCAL_MACHINE , "Software\\http ://www .sunxin .org\\ admin " , NULL ,
&lValue);
char *pBuf=new char[lValuel ;
RegQueryValue(HKEY_LOCAL_MACHINE , "Software\\http://www .sunxin .org\\ adm工n",pBuf,
&lValue) ;
MessageBox(pBuf) ;
在如例 12-28所示的代码中,为了获得先前写入注册表的项的默认值或未命名的值的数据而调用了
两次RegQueryVa1ue函数,第一次调用该函数后得到将要读取的数据的长度,然后根据此长度分配用
来保存数据的内存: pBuf.因为返回的长度本身就已经包含了标识字符串终止的空字符,因此就不需
要再多分配一个字节了。接下来,再次调用 RegQueryVa1ue函数,就得到了所需数据。最后,调用
MessageBox函数将读取到的数据显示出来。因为 pBuf指向的字符串中已经包含了表示终止的空字
符,所以不需要再对该字符串进行添加表示终止字符的处理了。.
运行File程序,单击【文件操作\读注册表】菜单项,从程序弹出的消息框中将可以看到读取到的数
据是正确的。
上面对注册表的操作中,写入数据和读取数据都是针对字符串类型的数据进行的,在实际应用中,
有时可能还需要写入或读取其他类型的数据,例如整型,此时在写入数据时就需要调用另一个函数:
RegSetValueEx。下面,我们就来看看向注册表中写入并从注册表中读取整型数据的方法。在如例
12-27所示CFileView类的OnRegWrite函数的第6行代码之后添加下述代码,以便在指定的注册表项下
设置指定值〈名称为 age)的数据(30)和类型 (DWORD) :
DWORD dwAge=30;
RegSetValueEx (hKey I "age" I 0 I REG_DWORD I (CONST BYTE*) &dwAge 14) ;
这里,因为RegSetValueEx函数的第5个参数,即值的数据,需要的是CONSTBYTE*类型,而变量dwAge
是DWORD类型,因此需要进行强制转换。另外,现在写入的是一个整型,占据4个字节,所以在
RegSetVa1ueEx函数中将写入数据的长度直接指定为4。 Build井运行File程序,单击【文件操作飞
写注册表】菜单项。然后打开注册表编辑器,可以看到HKEY-LOCAL-MACHmm
software\http://www.sunxin.oψadmp项下多了-个值(如图 12.20所示),值的名称是: age,类型
是REG_DWORD,值的数据是OxO∞∞01e,这是十六进制表示,十进制数是30。
,
~~ 1479
第12
zhar可Sen ox田X四JOle (30)
囹臼嗣晴tt-Pac阳d I 自己J http:J阳附.SU'lXI'1叫一
组黯圃囚臼Inst翩翩阴口INTEL回口K问soft
图 12.20向注册表中写入DWORD类型的值 接下来,在 File程序中读取刚才写入注册表的整型数据,
首先将OnRegRead函数中己有代码注释起来,然后添加如例 12-29所示实现代码。例 12-29
HKEY hKey ;
RegOpenKey(HKEY_LOCAL_MACHINE , "Software\\http ://www.sunxin .org\\ admin " , &hKey} ;
DWORD dwType ;
DWORD dwValue;
DWORD dwAge ;
RegQueryValueEx(hKey , "age ", O,&dwτype, (LPBYTE}&dwAge , &dwVa lue);
CString str;
str .Format( "age=革d",dwAge};
MessageBox(str} ;
在如例 12-29所示代码宁,首先调用 RegOpenKey函数打开指定的注册表项
CHKEY_LOCAL_MACHINE\Software\http://www.sunxin.org\admin)。之后,调用RegQuery ValueEx
函数得到该注册表项的值 Cage)的数据类型和数据。其中,该函数的第四个参数指向一个DWORD类型
的指针变量,用来接收返回的数据类型。另外还需要一个缓冲区来接收返回的数据,并且因为现在
接收的是一个整型数据,所以可以直接定义一下 DWORD类型的变量 CdwAge)来接收该数据:该函数的
最后一个参数: dwValue用来接收返回的数据的大小。
在如例 12-29所示代码在接收到所需数据之后,对其进行格式化,并保存到str这个对象中,最后调
用MessageBox函数把该字符串显示出来。运行 File程序,单击【文件操作\读注册表】菜单项,从
程序弹出的消息框中(如图
12.21所示),可以看到提示信息: age=30,表明读取到的数据是正确的。
,r
主l
_-30
图 12.21从注册表中读取整型数据的结果显示
480 I纱"
以上就是通过 Win32API提供的函数对注册表进行操作,上面介绍的只是其中的一部分函数,
Win32API还提供了一些以 Reg开头的函数,读者可以自行查看相关资料,了解这些函数。只要掌握
了这些函数的用法,就可以灵活地对注册表进行编程了。
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -