您的位置:首页 > 其它

使用BCB操作ini和注册表

2009-03-09 11:25 127 查看
在Windows
95/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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: