1、32位Delphi程序中可利用TRegistry对象来存取注册表文件中的信息。 一、创建和释放TRegistry对象 1.创建TRegistry对象。为了操作注册表,要创建一个TRegistry对象:ARegistry := TRegistry.Create; 2.释放TRegistry对象。对注册表操作结束后,应释放TRegistry对象所占内存:ARegistry.Destroy。 二、指定要操作的键 操作注册表时,首先应指定操作的主键:先给属性RootKey赋值以指定根键,然后用方法OpenKey来指定要操作的主键名。
2、 1.指定根键(RootKey)。 根键是注册表的入口,也注册表信息的分类,其值可为: HKEY—CLASSES—ROOT:存储整个系统对象类信息,如ActiveX对象注册、文件关联等信息。 HKEY—CURRENT—USER:存储当前用户的配置信息。为属性RootKey的默认值。 HKEY—LOCAL—MACHINE:存储当前系统的软硬件配置信息。应用程序自己的信息可以存储在该根键下。 HKEY—USERS:存储所有用户通用的配置信息。 还可以是HKEY—CURRENT—CONFIG、HKEY—DYN—DATA。
3、2.指定要操作的主键。 Function OpenKey(const Key: string; CanCreate: Boolean): Boolean; Key:主键名,是键名全名中除去根键的部分,如Software\Borland\Delphi。 CanCreate:在指定的主键名不存在时,是否允许创建该主键,True表示允许。 返回值True表示操作成功。 3.关闭当前主键。 在读取或存储信息之后,应及时将关闭当前主键:procedure CloseKey。 三、从注册表中读取信息 Read系列方法从注册表读取指定
4、的信息(字符串、二进制和十六进制),并转换为指定的类型。 1.Read系列方法。 function ReadString(const Name: string): string; 读取一个字符串值,Name为字符串名称。 function ReadInteger(const Name: string): Integer; 读取一个整数值,Name为整数名称。 function ReadBinaryData(const Name: string; var Buffer; BufSize: Integer):Integer; 读取二进制
5、值,Name为二进制值名称,Buffer为接收缓冲区,BufSize为缓冲区大小,返回为实际读取的字节数。 其它方法还有:ReadBool、ReadCurrency、ReadDate、ReadDateTime、ReadFloat、ReadTime。 2.读取信息一例(显示Windows的版本)。 在HKEY—LOCAL—MACHINE\Software\Microsoft\Windows\CurrentVersion下,有三个字符串值Version、VersionNumber和SubVersionNumber,用于记录当前Windows的版本号。
6、{请在Uses中包含Registry单元} procedure TForm1.Button1Click(Sender:TObject); var ARegistry : TRegistry; begin ARegistry := TRegistry.Create; //建立一个TRegistry实例 with ARegistry do begin RootKey := HKEY—LOCAL—MACHINE;//指定根键为HKEY—LOCAL—MACHINE //打开主键Software\Mi
7、crosoft\Windows\CurrentVersion if OpenKey( ′Software\Microsoft\Windows\CurrentVersion′,false ) then begin memo1.lines.add('Windows版本:′+ ReadString(′Version′)); memo1.lines.add('Windows版本号:′+ ReadString(′VersionNumber′)); memo1.lines.add(′Windows子版本号:′+ ReadStrin
8、g(′SubVersionNumber′)); end; CloseKey;//关闭主键 Destroy;//释放内存 end; end; 四、向注册表中写入信息 Write系列方法将信息转化为指定的类型,并写入注册表。 1.Write系列方法。 procedure WriteString(const Name, Value: string); 写入一个字符串值,Name为字符串的名称,Value为字符串值。 procedure WriteInteger(const Na
9、me: string; Value: Integer); 写入一个整数值。 procedure WriteBinaryData(const Name: string; var Buffer; BufSize: Integer); 写入二进制值,Name为二进制值的名称,Buffer为包含二进制值的缓冲区,BufSize为缓冲区大小。 其它方法还有:WriteBool、WriteCurrency、WriteDate、WriteDateTime、WriteFloat、WriteTime。 2.写入信息一例。 下面程序使Delphi随Window
10、s启动而自动运行。 var ARegistry : TRegistry; begin ARegistry := TRegistry.Create; //建立一个TRegistry实例 with ARegistry do begin RootKey:=HKEY—LOCAL—MACHINE; if OpenKey(′Software\Microsoft\Windows\CurrentVersion\Run′,True) then WriteString(′delphi′,′C:\Progra
11、m Files\borland\delphi3\bin\delphi32.exe′); CloseKey; Destroy; end; end; 五、键值维护 除了在注册表中读取、存储外,程序可能还需要增加主键、删除主键、主键改名、数据值改名等。 1.创建新主键:function CreateKey(const Key: string): Boolean。 Key即为主键名,返回值True表示操作成功。 2.删除主键:function DeleteKey(const Key: string): B
12、oolean。 Key即为主键名,返回值True表示操作成功。 3.复制或移动主键:procedure MoveKey(const OldName, NewName: string; Delete: Boolean)。 OldName、NewName分别表示源主键名和目标主键名;Delete表示是否删除源主键,True表示删除,False表示保留。 复制或移动一个主键将复制或移动该子键下的所有数据值和子键内容。 4.判断指定主键是否存在,其下是否有主键,并获取主键名称。 KeyExists用于判断指定主键是否存在: funct
13、ion KeyExists(const Key: string): Boolean;//返回值为True表示主键存在。 HasSubKeys用于判断指定主键下是否有子键:function HasSubKeys: Boolean; 返回值为True表示主键下有子键。 GetKeyNames用于获取子键名称:procedure GetKeyNames(Strings: TStrings); Strings用于返回当前主键下各子键的名称。 5.获取主键下的数据值名称:procedure GetValueNames(Strings: TStrings)
14、 Strings用于返回当前主键下各数值名称。 如要获取当前系统中的拨号连接名称,可利用获取主键HKEY—USERS \.DEFAULT\RemoteAccess\Addresses下的数值名称的方法来进行。 6.判断数值名称存在、数值名称改名。 ValueExists用于判断数值名称是否存在: function ValueExists(const Name: string): Boolean; 返回值为True表示数值名称存在。 RenameValue用于数值名称改名: procedure RenameValue(cons
15、t OldName, NewName: string); 以上是注册表常用操作所对应的TRegistry的方法和属性,其它方法和属性请参见Delphi联机帮助文件。 以上程序在PWIN 98+Delphi 3.0下调试通过。 2003-11-20 11:53:00 发表评语»»» 2003-11-20 11:59:20 注册表中对编程常用的几项(ODBC/BDE/Internet/Windows) 我用的是 WINDOWS 2000, WIN2000 的 REGEDIT 提供
16、了类似 IE 中收藏夹的功能,我的收藏夹中有几个或许对大家编程时会有帮助(这是本人在编程过程中的探索出来的,请高手指教): 1。关于 ODBC 和 DBE: HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\ODBC File DSN 有你的 COMPUTER 上 ODBC 的 FILE DSN 的存放的缺省路径,如果你建立 FILE DSN 的时候选择了自己的路径,那你就得小心了,系统不会为你保存该路径,你的自己记住它,:-(; HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST
17、INI\ODBC Drivers 列出了你的所有 ODBC DRIVER, 关于 ODBC DRIVER 的名称,有一个比较有趣的地方:不知大家又没有用TSession.GetDriverNames 取过系统 ODBC DRIVER 名,我用的时候 DRIVER 名最长只能取到 31 个字符,剩下的就被截掉了,不知是我编程有问题还是 DELPHI 的 BUG; HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBCINST.INI 列出了你的所有 ODBC DRIVER 的详细配置; HKEY_LOCAL_MACH
18、INE\SOFTWARE\ODBC\ODBC.INI 列出了你的所有 SYSTEM DSN 以及它们的配置情况; HKEY_CURRENT_USER\Software\ODBC\ODBC.INI 列出了你的所有 USER DSN 以及它们的配置情况; 知道了以上的几个主键后,你就可以在程序中实现 %SystemRoot%\system32\odbcad32.exe 的大部分功能了。 HKEY_LOCAL_MACHINE\SOFTWARE\Borland\Database Engine 下面是你的 DBE 的配置,我就不多说
19、了,大家拿它和 BDE 用户界面一比较就明白了。 2。关于 INTERNET 编程: HKEY_CLASSES_ROOT\htmlfile 系统对 HTMLFILE 的处理定义; HKEY_LOCAL_MACHINE\SOFTWARE\Clients INTERNET Option 中 INTERNET PROGRAM 的设定,尤其重要的是其中的 HKEY_LOCAL_MACHINE\SOFTWARE\Clients\Mail。 3。关于 WINDOWS 编程 HKEY_CURRENT_USER\Sof
20、tware\Microsoft\Windows\CurrentVersion\Run 每次该用户启动 WINDOWS 必定执行下面的命令(如果有,当然一般都有), HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Runonce 该用户启动 WINDOWS 必定执行下面的命令(如果有),执行完后由 WINDOWS 把命令删掉,安装软件的时候特别有用, 以上两处是针对特定用户的,在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentV
21、ersion 下还有类似的地方,是针对所有用户的,我就不罗嗦了。 2003-11-20 12:16:38 Delphi 中注册表构件TRegistry 的应用 在Delphi3.0 及以上版本中,提供了一个构件TRegistry。在程序中可以利用它来实现对WIN95/98/NT 注册表的操作,可以很方便地在注册表中增加、修改和删除键值。这样可以在程序中完成一些特殊的功能。 ---- TRegistry 常用的属性和方法有(具体作用和用法请参考Delphi 帮 助): RootKey、CreateKey、OpenKey、CloseKey、DeleteK
22、ey、ReadXXXX、WriteXXXX (XXXX表示数据类型如String、Integer等) 我们用到的属性和方法有: RootKey:注册表的根键名( 如HKEY_LOCAL_MACHINE等) OpenKey( KeyName:string; CanCreate:boolean ): 使当前键为KeyName,CanCreate 表示当指定的键不存在时是否创建,True 表示创建 SetKey( KeyName,KeyValue : string ):使键KeyName的值为KeyValue ---- 应用
23、之一:让自己的程序随WIN95/98/NT 的启动而运行 当然,你可以在"启动"程序组中加入程序的快捷方式,但这样做好象不大明智,因为大多数程序在安装时不会这样做,而是在通过在注册表增加键值,让WIN95/98/NT 在启动时运行自己的程序。如果打开注册表,找到HKEY_LOCAL_MACHINE \Software \Microsoft\Windows \CurrentVersion \Run,就会发现这个秘密了,原来许多自动运行的程序都在这里。你也可以在这里增加一个键,让你的程序也随着 WIN95/98/NT 的启动而自己运行,成为WINDOWS 下的TSR 程序。实现方法如下
24、 首先,在Uses 中加上Registry 单元 然后,写下面代码。 {将程序strExeFileName置为自动启动 } function StartUpMyProgram ( strPrompt,strExeFileName : string ) : boolean; var registerTemp : TRegistry; begin registerTemp := TRegistry.Create; //建立一个Registry实例 with registerTemp do begin RootKey:=
25、HKEY_LOCAL_MACHINE; //设置根键值为HKEY_LOCAL_MACHINE //找到Software\Microsoft\Windows\CurrentVersion\Run if OpenKey('Software\Microsoft\Windows\CurrentVersion\Run',True) then //写入自己程序的快捷方式信息 begin WriteString( strPrompt, strExeFileName ); result := true;
26、 end else result := false; //善后处理 CloseKey; Free; end; end; {调用StartUpMyProgram, 使Delphi随WINDOWS启动而自动运行 } procedure TForm1.Button1Click(Sender: TObject); begin memo1.lines.add('开始'); if StartUpMyProgram('delphi','C:\Program Files\borland\delphi3\
27、bin\delphi32.exe') then memo1.lines.add('成功') else memo1.lines.add('失败') end; ---- 应用之二:实现文件关联 当MS WORD 安装在你的系统中时,它会把.DOC 文件与自己关联,当你双击一个DOC 文件,就会启动MS WORD,打开你指定的DOC文件。你也可以把一个文件类型与一个程序关联起来,其秘密还是在注册表中。如果打开注册表,找到HKEY_CLASSES_ROOT,就会发现这里已经有很多文件类型。 你也可以在这里增加一个键,建立自己的文件关联。
28、 建立文件关联,一般应有两个步骤: (1)根据文件类型的扩展名,指定对应的键名(如doc 文件对应的键为doc_auto_file) 该键及其子键的值,将定义该类型的文件的类型说明和操作(如打开、编辑)说明 (2)在指定的键名下,建立子键,指明文件类型说明和操作对应的程序信息 例如,我们可以为.DBF 文件建立文件关联,其文件类型说明为"xBase 数据表",使其打开(Open)文件的操作对应程序C:\ProgramFiles\Borland\DBD\DBD32.EXE。首先,应在注册表的根键HKEY_CLASSES_ROO
29、T 下建立一个键,键名为.DBF,默认值为DBF_Auto_File,表示DBF 类型文件的关联操作信息记录在键HKEY_CLASSES_ROOT\DBF_Auto_File 下;然后,建立键 HKEY_CLASSES_ROOT\DBF_Auto_File,并设其默认值为"xBase 数据表",表示文件类型说明;再建立键HKEY_CLASSES_ROOT\DBF_Auto_File\Shell\open\command,设置其默认值为C:\Program Files\Borland\DBD\DBD32.EXE %1(其中"%1 "为命令行参数),表示打开操作对应的程序信息。 具体实
30、现如下:同样,在Uses 中加上Registry 单元, 然后,写下面代码。 {将文件类型strFileExtension与程序 strExeFileName相关联,strDiscription为文件类型说明 } function AssignToProgram(strFileExtension,strDiscription,strExeFileName : string ) : boolean; var registerTemp : TRegistry; begin registerTemp := TRegistry.Create; //建立一个Regis
31、try实例 with registerTemp do begin RootKey:=HKEY_CLASSES_ROOT; //设置根键值为HKEY_CLASSES_ROOT //根据文件类型的扩展名,创建或打开对应的键名.FileExt,如DBF对应'.DBF' if OpenKey( '.' + strFileExtension, true ) then begin result := false; exit; end; //设
32、置键.FileExt默认值为FileExt_Auto_File,如'.DBF'对应'DBF_Auto_File' WriteString('',strFileExtension + '_Auto_File'); CloseKey; //写入自己程序的信息 //根据文件类型的扩展名,创建或打开对应的键名 FileExt_Auto_File //'.DBF'对应'DBF_Auto_File' if OpenKey(strFileExtension + '_Auto_File', true ) then
33、 begin result := false; exit; end; //设置默认值文件类型说明,如DBF可对应'xBase数据表' WriteString('',strDiscription); CloseKey; //创建或打开键名FileExt_Auto_File\Shell\open\command,该键为表示操作为'打开' //'.DBF'对应'DBF_Auto_File\shell\open\command' if Op
34、enKey(strFileExtension + '_Auto_File\shell\open\command', true ) then begin result := false; exit; end; //设置该键的默认值为打开操作对应的程序信息 //如DBF可对应'C:\Program Files\Borland\DBD\DBD32.EXE' WriteString('',strExeFileName + ' %1'); CloseKey;
35、 Free; end; end; {调用AssignToProgram,使DBF文件与DBD32.EXE关联 } procedure TForm1.Button3Click(Sender: TObject); begin memo1.lines.add('开始'); if AssignToProgram('DBF','xBase数据表','C:\Program Files\borland\dbd\dbd32.exe') then memo1.lines.add('成功') else memo1.lines.add('失败')
36、 end; ---- 应用之三:检测Win95/98/NT 系统中是否安装了Borland Database Engine 当你的应用程序是一个基于BDE 的数据库应用程序时,如果运行在一个没有安装BDE 的Win95/98/NT 中,会出现让用户迷惑不解的错误。你可能需要在程序正常运行之前,检查系统中是否安装了BDE。由于 BDE 安装后会在注册表进行注册,你可以通过查询注册表来确定系统中是否安装了BDE,然后决定下一步采取什么行动。BDE 在注册表中的位置为: HKEY_LOCAL_MACHINE\Software\Borland\Database Engine
37、该键存在说明 BDE 已经安装。 具体的例子如下。 同样,在Uses 中加上Registry 单元 然后,写下面代码。 {检测系统中是否安装了BDE } function IsBDEInstalled : boolean; var registerTemp : TRegistry; begin registerTemp := TRegistry.Create; //建立一个Registry实例 with registerTemp do begin RootKey:=HKEY_LOCAL_MACHINE;
38、 //设置根键值为HKEY_LOCAL_MACHINE //查询Software\Borland\Database Engine result := OpenKey('Software\Borland\Database Engine',false); //善后处理 CloseKey; Free; end; end; {调用IsBDEInstalled,检测系统中是否安装了BDE } procedure TForm1.Button4Click(Sender: TObject); begin
39、 memo1.lines.add('开始'); if IsBDEInstalled then memo1.lines.add('已安装了BDE') else memo1.lines.add('未安装BDE') end; ---- 应用之四:在桌面建立程序的快捷方式 当你的WIN95/98/NT 桌面上整齐地排列着各种程序的快捷方式时,也许你会体会到快捷方式的方便。你也可将自己设计的程序的快捷方式放在别人的桌面上。 桌面上的一个快捷方式,对应Windows 目录下Destop 子目录中的一个ShellLink 文件(.
40、LNK),你只要在这个目录下增加一个.LNK 文件就可以了。 我们的任务,主要是利用TRegistry 从注册表中获取Desktop 的实际路径,默认为Windows 目录下的Desktop 子目录,如C:\PWIN98\Desktop。在注册表中Desktop 的实际路径对应的键为HKEY_CURRENT_USER \Software\MicroSoft \Windows \CurrentVersion \Explorer \Shell Folders \Desktop。 同样,在Uses 中加上Registry 单元 然后,写下面代码。 {为程序strE
41、xeFileName在桌面建立快捷方式,运行参数为strParameters } function CreateShortcutOnDesktop( strExeFileName, strParameters : string ) : boolean; var registerTemp : TRegistry; strDesktopDirectory : widestring; shelllinkTemp : IShellLink; persistfileTemp : IPersistFile; begin registerTemp := TRegistry
42、Create; //建立一个Registry实例 with registerTemp do begin RootKey:=HKEY_CURRENT_USER; //设置根键值为HKEY_CURRENT_USER //找到Software\MicroSoft\Windows\CurrentVersion\Explorer\Shell Folders if not OpenKey('Software\MicroSoft\Windows\CurrentVersion\Explorer\Shell Folders',Tru
43、e) then //写入自己程序的信息 begin result := false; exit; end; //读取项目Desktop的值,即Desktop的实际路径 strDesktopDirectory := ReadString('Desktop'); //善后处理 CloseKey; Free; end; //设置快捷方式的参数 shelllinkTemp := IShellLink( CreateCo
44、mObject(CLSID_ShellLink)); with shelllinkTemp do begin SetPath( PChar( strExeFileName ) ); //设置程序文件全名 SetArguments( PChar( strParameters) ); //设置程序的命令行参数 //设置程序的工作目录 SetWorkingDirectory( Pchar( ExtractFilePath( strExeFileName ) ) ); end; /
45、/构造快捷方式的文件名(.LNK) strDesktopDirectory := strDesktopDirectory + '\' + ExtractFileName( strExeFileName ); strDesktopDirectory := copy( strDesktopDirectory, 1, length( strDesktopDirectory ) - length( ExtractFileExt( strExeFileName ) ) ) + '.LNK'; //保存快捷方式的文件 persistfileTemp := shelllinkTem
46、p as IPersistFile; if S_OK = persistfileTemp.Save( PWChar( strDesktopDirectory ) , false ) then result := true //保存成功,返回True else result := false; end; {调用CreateShortcutOnDesktop,为Delphi在桌面上建立快捷方式 } procedure TForm1.Button2Click(Sender: TObject); begin memo1.lines.add('开始');
47、 if CreateShortcutOnDesktop('C:\Program Files\borland\delphi3\bin\delphi32.exe','%1') then memo1.lines.add('成功') else memo1.lines.add('失败') end; 【结语】:上面几个应用只是TRegistry 一些简单的应用,有了这些知识,你就可以根据自己的需要来定制和改善Winodws 系统了。 ---- 以上程序在PWin98+Delphi3.0 下调试和通过。 2003-11-20 12:21:25
48、 备份部分注册表的代码Procedure ExportRegistryBranch (rootsection : Integer; regroot:String; filename:String); implementation Function dblBackSlash(t:string):string; var k:longint; begin result:=t; {Strings are not allowed to have} for k:=length(t) downto
49、1 do {single backslashes} if result[k]='\' then insert('\',result,k); end; Procedure ExportRegistryBranch (rootsection : Integer; regroot:String; filename:String); var reg:tregistry; f:textfile; p:PCHAR; Procedure ProcessBranch(root:string); {recu
50、rsive sub-procedure} var values, keys:tstringlist; i,j,k:longint; s,t:string; {longstrings are on the heap, not on the stack!} begin writeln(f); {write blank line} case rootsection of HKEY_CLASS






