用CB节制Windows注册表
Windows注册表中包括了系统设置、呆板硬件设置、Win32应用措施和用户的其他设置信息。注册表按照系统信息分为六个根键(RootKey),个中每个根键各有一个由子键和键值构成的树状布局,每个子键代表一个特定的设置项目。
用C++Builer节制注册表的要害在于相识TRegistry 类。在C++Builder的VCL类库中,提供了TRegistry类,通过在应用措施中生成这个类的实例,我们可以实现对注册表的节制。在TRegistry类中,重点应该把握如下问题:
1.TRegistry类的生成
我们不能用直接声明的要领生成TRegistry的实例,这与VC++顶用HKEY直接生成实例的要领差异。必需回收new要害字生成TRegistry 类的实例,然后将指针通报给声名的变量。详细操纵如下:
TRegistry * curReg=new TRegistry;//curReg是 TRegistry范例的指针名
回收这个方法声明后,curReg的RootKey属性指向 HKEY_CURRENT_USER根键,即默认操纵是针对HKEY_CURRENT_USER举办的。
2.如何打开和封锁主键
TRegistry类提供了两个成员函数打开一个主键: OpenKey()和OpenKeyReadOnly()函数。个中,OpenKey函数同时提供了建设主键的成果。
OpenKey()有两个参数,KeyName和canCreate。canCreate 是一个bool型参数,当它配置成true时,假如当前根键下不存在AnsiString类的变量 KeyName所指出的主键,则建设这个主键;不然进入KeyName指出的主键。假如canCreate 配置成false,而当前根键下没有KeyName指出的主键,则函数返回false。
OpenKeyReadOnly()函数的成果是以只读方法打开一个主键,假如参数值是NULL,则指向RootKey指明的键。
KeyName参数有两种暗示要领:绝对路径暗示和相对路径暗示。回收绝对路径暗示时,串值必需以“\\"开头;回收相对路径则暗示KeyName指明的主键是相对付当前主键而言的。
在注册表利用完毕后,该当实时挪用CloseKey()成员函数封锁注册表,并挪用delete要领将用new申请的内存空间释放。
3.关于当前主键下子键值的获取
我们可以用GetKeyNames()成员函数获得当前主键下所有子键的名称,用GetKeyInfo获得越发具体的信息。
必需指出,固然GetKeyNames()的说明成void __fastcall GetKeyNames(Classes::TStrings * Strings),也就是说,它的参数范例是TString,可是我们并不能首先声明一个TString类的实例,然后将它作为参数用于GetKeyNames()。这主要是由于TStrings类含有抽象身分。我们的办理要领是回收TStrings类的派生类TStringList来取代TStrings声明一个实例,并作为参数用于GetKeyNames()函数。
在得到子键的名称后,我们就可以操作有关函数进一步确定具体信息。譬喻,我们可以用GetValueNames()团结Read()和 Write()得到主键的值的具体信息。譬喻:我们要读“\Software\Sybase”中的 “Location”串值的信息,可以执行如下操纵:
curReg->OpenKey(“\\Software\\Sybase",true);
AnsiString ValueInfo=CurReg->ReadString(“Location");
这时,ValueInfo就得到了Location的值。
4.关于属性的说明
TRegistry类的一个主要属性是LazyWrite。这个属性的浸染是抉择是否在执行写操纵之后当即将所做的窜改反应到实际的注册表中。这个属性的值在注册表工具结构时初始化为true,即不当即将所做的窜改反应到实际的注册表中,而是在执行CloseKey()函数之后重写注册表,这样可以提高系统机能。可是,假如我们需要将修改当即反应到注册表(这在很多场所是须要的),则该当首先将LazyWrite属性配置为false,然后执行修改操纵。
另一个值得一提的属性是RootKey,这个属性划定了当前操纵的工具是哪一个根键,默认为HKEY_CURRENT_USER。假如需要对其他根键举办操纵,直接将方针根键的值赋给RootKey属性即可。
下面请看我们的措施中的一个实际片断,这个例子的成果是将“\Software\MyInfo”主键下的所有子键名称显示在ComboBox1中:
#include
…………
TRegistry *curReg=new TRegistry;
curReg->OpenKey(“Software\\MyInfo",true);
KeyNames=new TStringList();//留意TstirngList类的声明要领!
curReg->GetKeyNames(KeyNames); for(int i=0;iCount;i++) ComboBox1->Items->Add(KeyNames->
Strings[i]);
curReg->CloseKey();
delete KeyNames;
…………
由此看来,在C++Builder情况下节制注册表的问题并不巨大,操作C++强大的类库,我们可以很轻松地完成这个事情。