C++Builder注册表编程实例详解
当前位置:以往代写 > C/C++ 教程 >C++Builder注册表编程实例详解
2019-06-13

C++Builder注册表编程实例详解

C++Builder注册表编程实例详解

副标题#e#

一、注册表编程详解

Windows 注册表中包括了系统设置、呆板硬件设置、 Win32 应用措施和用户的其他设置信息。很多高级一些的成果都要通过对注册表的操纵来实现。在 WinAPI 中提供了 RegCgreateKey() 、 RegOpenKey() 、 RegQueryValue() 等函数操纵注册表,可是用这些函数来操纵注册表利用起来很是贫苦。而操作 C ++ Builder 的 TREGISTRY 类,我们则可以轻松实现对注册表的操纵。下面我先先容一下 TRegistry 类利用要领。

1. 利用前的筹备事情:

首先必需在措施开始处包括界说类模块的头文件:

#include -registry.hpp-

其次在全程变量(即所有函数之前)建设类的一个实例(工具):

TRegistry * 实例名 =new TRegistry();

留意:我们不能用直接声明的要领生成 TREGISTRY 的实例,这与 VC ++顶用 HKEY 直接生成实例的要领差异。必需回收 new 要害字生成 TREGISTRY 类的实例,然后将指针通报给声名的变量。回收这个方法声明后,实例的 RootKey 属性指向 HKEY_CURRENT_USER 根键,即默认操纵是针对 HKEY_CURRENT_USER 举办的。

2. 常用属性和要领先容:

(1) 当前根键属性( RootKey ):

RootKey 属性界说了注册表类实例当前根键,默认的是 HKEY_LOCAL_USER , 假如我们需要在其它根键下对注册表举办操纵,可以修改 RootKey 属性:

MyReg->RootKey= 根键名 ;

BCB 中对注册表根键共有以下几个界说: HKEY_CURRENT_USER 、 HKEY_CLASSES_ROOT 、 HKEY_LOCAL_MACHINE 、 HKEY_USERS 、 HKEY_CURRENT_CONFIG 、 HKEY_DYN_DATA 、 HKEY_USERS 。别离对应注册表中相应的主键。(该属性为 int 型)

(2)当前键值的文本描写属性( CurrentPath ):


#p#副标题#e#

CurrentPath 属性界说了注册表当前键值的文本描写,如\HKEY_CURRENT_USER\Software\Borland 的 CurrentPath=-Software\Borland- ,而 RootKey=HKEY_CURRENT_USER (该属性为 AnsiString 型)。

(3)是否使修改后的值当即反应到注册表中( LazyWrite ):

这个属性的浸染是抉择是否在执行写操纵之后当即将所做的窜改反应到实际的注册表中。这个属性的值在注册表工具结构时初始化为 true ,即不当即将所做的窜改反应到实际的注册表中,而是在执行 CloseKey() 函数之后重写注册表,这样可以提高系统机能。可是,假如我们需要将修改当即反应到注册表(这在很多场所是须要的),则该当首先将 LazyWrite 属性配置为 false ,然后执行修改操纵。

(4) 成立主键函数:

bool __fastcall CreateKey( 主键名 );

假如主键已经存在,就包围原主键。如在当前主键下成立“ MyReg ”主键,可用“ CreateKey(-MyReg-) ”,而“ CreateKey(-\\MyReg-) ” 则在当前根键下成立主键 MyKey 。

(5) 删除主键函数:

bool __fastcall DeleteKey( 主键名 );

假如参数为空字符串,则删除当前键值 。

(6) 打开主键函数 :

bool __fastcall OpenKey( 主键名,参数 );

此函数将定位到一个详细的主键位置,随后的操纵(成立键值、删除键值以及在当前位置成立主键、删除主键)将以此主键为当前主键。参数为 True 则当主键不存在将成立这个主键,假如为 false 则不成立主键。

(7) 读取当前主键下 String 型的键值函数:

AnsiString __fastcall ReadString( 键值名 );

如: Edit1->Text=MyReg->ReadString(-MyString-);

#p#副标题#e#

将读取键值 MyString 的内容到文本框 Edit1 中。 同此函数雷同的尚有 ReadBool() 、 ReadInteger() 、 ReadFloat() 、 ReadDateTome() 、 ReadBinaryData() 等,用来读出差异范例的键值。

(8) 在当前主键中写入 String 型键值函数:

void __fastcall WriteString( 键值名,数据 );

假如是一个新键值名,那么相当于新建一个键值;假如是已有的键值,那么就是修改键值的数据。

如: WriteString(- 我的串 -,- 内容 -); 其它范例的键值(二进制值、 Dword 值)的读取和写入函数如 WriteInteger 、 WriteBool() 、 WriteFloat() 、 WriteDateTome() 、 WriteBinaryData() 等用法与上述雷同。

(9) 判定键值或主键是否存在的函数:

bool __fastcall ValueExists( 键值名 );

这个要领判定当前键下是否存在指定的数据项,假如存在返回 true ,不然返回 false 。

bool __fastcall KeyExists( 主键名 );

这个要领判定一个键是否存在,假如存在返回 true ,不然返回 false 。

(10)从文件读入键值函数:

LoadKey( 键值名 , 文件名 ) ;

(11)一个键值生存到文件函数:

SaveKey( 键值名 , 文件名 ) ;

(12) 封锁键值函数:

void __fastcall CloseKey(void);

在注册表利用完毕后,该当实时挪用 CloseKey() 成员函数封锁注册表,并挪用 delete 要领将用 new 申请的内存空间释放。

(13)当前主键下子键值的获取函数:

void __fastcall GetKeyNames(Classes::TStrings * Strings) ;

#p#分页标题#e#

我们可以用该成员函数获得当前主键下所有子键的名称,用 GetKeyInfo 获得越发具体的信息。必需指出,固然 GetKeyNames() 的说明成 void __fastcall GetKeyNames(Classes::TStrings * Strings) ,也就是说,它的参数范例是 TString ,可是我们并不能首先声明一个 TString 类的实例,然后将它作为参数用于 GetKeyNames() 。这主要是由于 TStrings 类含有抽象身分。我们的办理要领是回收 TStrings 类的派生类 TStringList 来取代 TStrings 声明一个实例,并作为参数用于 GetKeyNames() 函数。

#p#副标题#e#

在得到子键的名称后,我们就可以操作有关函数进一步确定具体信息。如用我们可以用 GetValueNames() 团结 Read() 和 Write() 得到主键的值的具体信息。请看下面实例,这个例子的成果是将“ \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;

3 利用 TRegistry 的一般步调

一般来说,有以下四步操纵:

1) 成立 TRegistry 类。 2) 操作 OpenKey() 要领打开一个键值。 3) 用 ReadType() 和 WriteType() 读写键值。 4) 挪用 CloseKey ()封锁一个键值,最后挪用 delete 要领将用 new 申请的内存空间释放。

二、应用实例1

下面我们通过一个示例措施演示了对注册表的常见操纵,包罗打开主键、读取差异范例的键值、删除键值或主键等。“每次启动电脑自动运行”复选框则实现的浸染雷同 Win 95 的 Welcome.exe 措施的成果。

首先在窗体添加 Edit1 、 Label1 、 label 2 (用于显示运行次数)、 Button1 、 CheckBox1 ( Caption= “每次启动电脑自动运行”)等几个控件,然后添加以下源代码。生成可执行文件后,更名为 MyReg.EXE 拷贝到 C: 盘根目次下执行即可。

源代码:

#p#副标题#e#

//--------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include -registry.hpp- // 包括头文件
#include -Unit1.h-
//--------------------------------------------
#pragma package(smart_init)
#pragma resource -*.dfm-
TForm1 *Form1;
TRegistry *MyReg=new TRegistry();// 成立实例
//--------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{}
//--------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{MyReg->RootKey=HKEY_CURRENT_USER;
if((MyReg->OpenKey(-\\software\\MyReg-,false))==false)
{MessageBox(NULL,- 感激第一次利用本软件 !.-,- 接待 !-,IDOK);
MyReg->CreateKey(-\\software\\MyReg-);
MyReg->OpenKey(-\\software\\MyReg-,true);
MyReg->WriteInteger(-Number-,0);
MyReg->WriteString(-The String-,Edit1->Text);
}// 检测有无注册表项 , 没有则成立
int num=MyReg->ReadInteger(-Number-);
num++;
MyReg->WriteInteger(-Number-,num);// 利用次数 +1 并写入注册表
Label2->Caption=IntToStr(num);
Edit1->Text=MyReg->ReadString(-The String-);
MyReg->CloseKey();
MyReg->RootKey=HKEY_LOCAL_MACHINE;
MyReg->OpenKey(-\\software\\Microsoft\\windows\\CurrentVersion\\Run-,false);
CheckBox1->Checked=MyReg->ValueExists(-AutoShow-);
MyReg->CloseKey();// 按照是否自动运行设定 CheckBox 状态
}
//--------------------------------------------
void __fastcall TForm1::Edit1Change(TObject *Sender)
{MyReg->RootKey=HKEY_CURRENT_USER;
MyReg->OpenKey(-\\software\\MyReg-,false);
MyReg->WriteString(-The String-,Edit1->Text);
MyReg->CloseKey();//Edit1 改变写入注册表
}
//--------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{MyReg->RootKey=HKEY_LOCAL_MACHINE;
MyReg->OpenKey(-\\software\\Microsoft\\windows\\CurrentVersion\\Run-,false);
if(CheckBox1->Checked)
MyReg->WriteString(-AutoShow-,-c:\\MyReg.EXE-);
else MyReg->DeleteValue(-AutoShow-);
MyReg->CloseKey();// 假如 CheckBox 选中则自动运行 , 不然删除自动运行键值
delete MyReg;
}
//--------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)// 单击 Button1 删除注册表项
{MyReg->RootKey=HKEY_LOCAL_MACHINE;
MyReg->OpenKey(-\\software\\Microsoft\\windows\\CurrentVersion\\Run-,false);
MyReg->DeleteValue(-AutoShow-);
MyReg->CloseKey();//* 删除自动运行键值
MyReg->RootKey=HKEY_CURRENT_USER;
MyReg->DeleteKey(-\\software\\MyReg-);// 删除注册表项
}

#p#副标题#e#

三、注册表编程实例2—— 编写输入法调序器

#p#分页标题#e#

凡是我们利用输入法时,要按下Ctrl+空格键多次才气找到本身所熟悉的输入法,那么我们能不能把本身最常用的输入法调到英文输入法后头呢?(即只按一下Ctrl+空格即可调出本身利用的输入法)笔者颠末研究,终于设计出了一个输入法调序器。它可以把当前系统中的所有输入法全部列出来,并可自由调解输入法顺序。下面笔者就把实现要领先容给各人。

措施实现道理:

我们知道在注册表HKEY_CURRENT_USER\keyboard layout\preload下有子键1、2、3、4、5(这就是输入法的顺序),每个子键的缺省键值即为标识该输入法的串值,如串值00000409对应的是英文输入法,串值E0040804对应的是智能ABC输入法。假如想知道每一个串值对应什么输入法,我们可以在HKEY_lOCAL_MACHINE\System\CurrentControlSet\Control\Keyboard Layouts之下找到。知道了输入法的存放位置及顺序干系后,我们可以操作措施操纵注册表把代表输入法顺序的串值举办相应移动,即可实现我们的目标了。

详细实现步调:

1、新建一工程文件,在窗体上放入一个ListBox组件、三个BitBtn组件和一个Label组件。

2、在窗体的单位文件中界说全局变量如下:

AnsiString *imeStr,temStr;

TRegistry *Reg1,*Reg2;//注册表工具

TRegKeyInfo keyInfo;//主键信息变量

并在单位文件前部增加包括#include <Registry.hpp>

3、在窗体的OnCreate事件进程中输入如下代码

void __fastcall TForm1::FormCreate(TObject *Sender)
{
Reg1=new TRegistry;//建设注册表工具
Reg2=new TRegistry;
Reg1->RootKey=HKEY_CURRENT_USER;//定位注册表根键
Reg2->RootKey=HKEY_LOCAL_MACHINE;
if(Reg1->OpenKey("\\keyboard layout\\preload\\",false)==true)
Reg1->GetKeyInfo(keyInfo);//取得指定主键信息
ListBox1->Items->Clear();
imeStr=new AnsiString[keyInfo.NumSubKeys];//动态建设数组
for(int i=0;i<keyInfo.NumSubKeys;i++)
{
if(Reg1->OpenKey("\\keyboard layout\\preload\\"+IntToStr(i+1),false)==true)
imeStr[i]=Reg1->ReadString("");//取得输入法串值
if(Reg2->OpenKey("\\System\\CurrentControlSet\\Control\\Keyboard Layouts\\"+imeStr[i]+"\\",false)==true)
ListBox1->Items->Add(Reg2->ReadString("layout text"));//显示输入法名称
}
Reg1->CloseKey();
Reg2->CloseKey();
delete Reg2;
}

4、在BitBtr1(上移按钮)的OnClick事件中插手如下代码

#p#副标题#e#

void __fastcall TForm1::BitBtn1Click(TObject *Sender)
{
int i=ListBox1->ItemIndex;//当前选择的行号
if (i>0)
{
ListBox1->Items->Exchange(i,i-1);//互换列表框中内两行的内容
temStr=imeStr[i];//对应串值也互换
imeStr[i]=imeStr[i-1];
imeStr[i-1]=temStr;
}
}

5、雷同地,在BitBun2(下移)的OnClick事件中插手如下代码

void __fastcall TForm1::BitBtn2Click(TObject *Sender)
{
int i=ListBox1->ItemIndex;//当前选择的行号
if (i<ListBox1->Items->Count-1)
{
ListBox1->Items->Exchange(i,i+1);
temStr=imeStr[i];//对应串值也互换
imeStr[i]=imeStr[i+1];
imeStr[i+1]=temStr;
}
}

6、在BitBtn3(确认按钮)的OnClick事件中插手如下代码

void __fastcall TForm1::BitBtn3Click(TObject *Sender)
{
if((Application->MessageBox("确认变动输入法顺序吗?","请确认",MB_OKCANCEL|MB_ICONWARNING))==ID_OK)
{
for(int i=0;i<keyInfo.NumSubKeys;i++)
{
Reg1->OpenKey("\\keyboard layout\\preload\\"+IntToStr(i+1),false);
Reg1->WriteString("",imeStr[i]);
}//给输入法从头排序
Reg1->CloseKey();
delete Reg1;
delete imeStr;
if((Application->MessageBox("顿时要从头启动计较机","重启计较机",MB_OKCANCEL|MB_ICONWARNING))==ID_OK)
ExitWindowsEx(EWX_REBOOT,0);
}
Close();
}

以上措施在Windows 98、C++ builder6.0下调试通过。

    关键字:

在线提交作业