使用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;
}
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;
}
相关文章推荐
- 使用BCB操作ini和注册表
- bcb操作注册表及Ini的方法
- 在DOS命令行下使用的注册表操作工具reg.exe
- MFC的注册表操作—CRegKey类的使用
- 使用VC操作Windows Moblie 注册表
- 使用API函数操作ini配置文件
- 使用Java操作Windows系统注册表
- 使用Python操作注册表
- 使用C#操作ini文件
- BCB使用Variant和Automation对象操作Word
- ATL使用.rgs注册脚本文件操作注册表注册Com组件
- 使用Python操作注册表
- VC操作INI文件 ,INI文件操作总结,如何操作INI文件,INI文件使用方法小结
- WinForm通过操作注册表实现限制软件使用次数的方法
- ini 文件操作记要(1): 使用 TIniFile
- Reg命令使用详解 批处理操作注册表必备
- 封装的注册表操作接口(目前使用在WINCE上)
- 使用Java操作Windows系统注册表
- 使用C#操作注册表
- 如何使用.REG文件来操作注册表