使用BCB操作ini和注册表

来源:互联网 发布:sd卡损坏 数据恢复 编辑:程序博客网 时间:2024/06/06 08:59

 在Windows95/98中,系统注册表有6个主键,分别是HKEY_LOCAL_MACHINE、HKEY_CLASSES_ROOT、HKEY_CURRENT_CONFIG、HKEY_USERS、HKEY_CURRENT_USER和HKEY_DYN_DATA。而Win2000中注册表去掉了主键HKEY_DYN_DATA。只有五个主键。下面简单介绍下每个主键的作用:

HKEY_LOCAL_MACHINE主键中存放本机系统的硬件和软件配置,它保存了注册表的大部分信息,是注册表中最重要的主键。这些设置是针对所有使用Windows系统的用户而设置,是一个公共信息,所以它与具体用户无关。

HKEY_CLASSES_ROOT主键中记录的是Windows操作系统中所有COM服务器以及与应用程序关联的文件扩展名、文件图标等信息。当用户双击一个文档时,系统可以通过这些信息启动相应的应用程序。HKEY_CLASSES_ROOT主键中存放的信息与HKEY_LOCAL_MACHINE/Software/Classes分支中存放的信息是一致的。

HKEY_CURRENT_CONFIG主键,如果在Windows中设置了两套或两套以上的硬件配置文件,则在系统启动时将会让用户选择使用哪套配置。而HKEY_CURRENT_CONFIG主键中存放的正是当前配置文件的所有信息。

HKEY_USERS主键中保存的默认用户(.DEFAULT)、当前登录用户与软件的信息。

HKEY_CURRENT_USER主键中保存的信息(当前用户的子键信息)与HKEY_USERS/.(注意这里有个点)DEFAULT分支中所保存的信息是相同的。任何对它们的操作都会导致对另一方的修改。

HKEY_DYN_DATA主键包含了系统运行中的动态数据,即已发生事件的有关信息。因此这个关键字的内容不仅包含系统硬件的当前状态,也包含了那些需要更新和检索的数据。这些数据都是动态变化的,他们总是最新信息。

在C++ Builder中访问注册表或者INI文件是相当容易的。因为VCL提供了几个预定义的类帮助程序员维护和使用INI文件和注册表。这里之所以把它们放在一起讲解,是因为它们在C++ Builder中的处理是类似。

这几个有关的VCL类是:
TRegistry处理注册表。
TIniFile/TMemIniFile处理INI文件。
TRegistryIniFile既可以处理注册表,也可以处理INI文件。除了读写系统注册表外,它的属性和方法与TIniFile类似。通过使用TCustomIniFile类(TIniFile、TMemIniFile和TRegistryIniFile共同的基类)的成员变量或函数,可编写出访问注册表或INI文件的通用代码。

我们的测试程序主要实现的功能有两个,一个是当主窗体关闭的时候,在INI文件中存储窗体的位置坐标,当下一次打开本程序的时候,从这个INI文件中读取此坐标,并在窗体上次关闭的位置上显示窗体;另一个功能是当用户单击按钮时,如果当前Windows开始菜单中有“文档”这一项,则隐藏它,反之则显示它。这个变化将在重新启动Windows后表现出来。

为了在程序中正常使用类TiniFile和Tregistry,需要包含头文件inifiles.hpp和registry.hpp。
首先完成在窗体关闭的时候保存窗体位置的功能,在主窗体的OnClose事件处理函数中添加以下代码:
//记录关闭时窗口的位置
TIniFile *pIniFile;
AnsiString FileName;
FileName=ChangeFileExt(Application->ExeName,".ini");
pIniFile=new TIniFile(FileName);
pIniFile->WriteInteger(Caption,"Top",Top);
pIniFile->WriteInteger(Caption,"Left",Left);
delete pIniFile;
与之对应地,在窗体的OnShow事件处理函数中添加以下代码:
//窗口显示时,读取上次关闭时的Top和Left值
TIniFile *pIniFile;
AnsiString FileName;
FileName=ChangeFileExt(Application->ExeName,".ini");
pIniFile=new TIniFile(FileName);
Top=pIniFile->ReadInteger(Caption,"Top",200);
Left=pIniFile->ReadInteger(Caption,"Left",200);
delete pIniFile;
从以上程序可以看到,使用TIniFile类的步骤如下:
(1)建立TIniFile对象
(2)使用WriteType()(Type可以是Integer、Bool等)函数存储数据或使用ReadType()读取。
(3)删除TIniFile对象。

本例中使用函数ChangeFileExt()生成了和可执行文件同名的INI文件。当然这样的文件名并不是必须的。在初始化TIniFile对象时,将INI文件名作为参数传入构造函数TiniFile(),如该文件不存在就会自动创建一个。本例中使用ReadInteger()读取数据,根据存储数据类型的不同还可以是函数ReadBool()、ReadDate()、ReadDateTime()、ReadFloat()或者ReadTime()。类似的写入函数也一样。在每个函数中需要3个参数:第一个参数给出INI文件的节;第二个参数给出需读写的值;第三个参数是一默认值,当该节或值不处于INI文件中时将使用或创建这个默认值。

接下来我们将使用类TRegistry来操作注册表实现另一个功能。

作为背景知识,我们需要知道,在注册表的路径HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Policies/Explorer里可以添加一个新值NoRecentDocsMenu(DWORD),将其设置为1表示隐藏“开始”菜单中的文档项;反之,为0则表示显示这个菜单项。

通常使用TRegistry类的步骤如下:
(1)创建TRegistry类的新对象;
(2)设定主键
(3)使用OpenKey()方法打开目标键值
(4)使用ReadType()或WriteType()(这里的Type需根据不同情况适当变化)读写键值。
(5)使用CloseKey()关闭此键值

测试代码如下:

TRegistry *Reg=new TRegistry;
try
{
Reg->RootKey=HKEY_CURRENT_USER;
Reg->OpenKey("Software//Microsoft//Windows//CurrentVersion//Policies//Explorer",true);
//如果键值NoRecentDocsMenu不存在
if( !Reg->ValueExists("NoRecentDocsMenu") )
{
Reg->WriteInteger("NoRecentDocsMenu",1);
return;
}
//如果键值为0
if(Reg->ReadInteger("NoRecentDocsMenu")!=1)
{
Reg->WriteInteger("NoRecentDocsMenu",1);
}
else
{
Reg->WriteInteger("NoRecentDocsMenu",0);
}
}
__finally
{
delete Reg;
}

原创粉丝点击