注册表控制右键菜单(三)

 
  一、创建和释放TRegistry对象 

  1.创建TRegistry对象。为了操作注册表,要创建一个TRegistry对象:ARegistry := TRegistry.Create; 

  2.释放TRegistry对象。对注册表操作结束后,应释放TRegistry对象所占内存:ARegistry.Destroy。 

  二、指定要操作的键 

  操作注册表时,首先应指定操作的主键:先给属性RootKey赋值以指定根键,然后用方法OpenKey来指定要操作的主键名。 

  1.指定根键(RootKey)。 
  根键是注册表的入口,也注册表信息的分类,其值可为: 
  HKEY—CLASSES—ROOT:存储整个系统对象类信息,如ActiveX对象注册、文件关联等信息。 
  HKEY—CURRENT—USER:存储当前用户的配置信息。为属性RootKey的默认值。 
  HKEY—LOCAL—MACHINE:存储当前系统的软硬件配置信息。应用程序自己的信息可以存储在该根键下。 
 HKEY—USERS:存储所有用户通用的配置信息。 
  还可以是HKEY—CURRENT—CONFIGHKEY—DYN—DATA。 

  2.指定要操作的主键。 
  Function OpenKey(const Key: string; CanCreate: Boolean): Boolean; 
  Key:主键名,是键名全名中除去根键的部分,如Software\Borland\Delphi。 
  CanCreate:在指定的主键名不存在时,是否允许创建该主键,True表示允许。 
  返回值True表示操作成功。 

  3.关闭当前主键。 
  在读取或存储信息之后,应及时将关闭当前主键:procedure CloseKey。 

  三、从注册表中读取信息 
  Read系列方法从注册表读取指定的信息(字符串、二进制和十六进制),并转换为指定的类型。 

  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; 
  读取二进制值,Name为二进制值名称,Buffer为接收缓冲区,BufSize为缓冲区大小,返回为实际读取的字节数。 
  其它方法还有:ReadBoolReadCurrencyReadDateReadDateTimeReadFloatReadTime。 

  2.读取信息一例(显示Windows的版本)。 
 在HKEY—LOCAL—MACHINE\Software\Microsoft\Windows\CurrentVersion下,有三个字符串值VersionVersionNumberSubVersionNumber,用于记录当前Windows的版本号。 

  {请在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\Microsoft\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子版本号:+ ReadString(′SubVersionNumber′)); 
   end; 
   CloseKey;//关闭主键 
   Destroy;//释放内存 
   end; 
  end; 

  四、向注册表中写入信息 
  Write系列方法将信息转化为指定的类型,并写入注册表。 

  1.Write系列方法。 
  procedure WriteString(const Name, Value: string); 
  写入一个字符串值,Name为字符串的名称,Value为字符串值。 
  procedure WriteInteger(const Name: string; Value: Integer); 
  写入一个整数值。 
  procedure WriteBinaryData(const Name: string; var Buffer; BufSize: Integer); 
  写入二进制值,Name为二进制值的名称,Buffer为包含二进制值的缓冲区,BufSize为缓冲区大小。 
  其它方法还有:WriteBoolWriteCurrencyWriteDateWriteDateTimeWriteFloatWriteTime。 

  2.写入信息一例。 
  下面程序使DelphiWindows启动而自动运行。 

  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:\Program 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): Boolean。 
  Key即为主键名,返回值True表示操作成功。 

  3.复制或移动主键:procedure MoveKey(const OldName, NewName: string; Delete: Boolean)。 
  OldNameNewName分别表示源主键名和目标主键名;Delete表示是否删除源主键,True表示删除,False表示保留。 
  复制或移动一个主键将复制或移动该子键下的所有数据值和子键内容。 

  4.判断指定主键是否存在,其下是否有主键,并获取主键名称。 
  KeyExists用于判断指定主键是否存在: 
  function KeyExists(const Key: string): Boolean;//返回值为True表示主键存在。 
  HasSubKeys用于判断指定主键下是否有子键:function HasSubKeys: Boolean; 
  返回值为True表示主键下有子键。 
 GetKeyNames用于获取子键名称:procedure GetKeyNames(Strings: TStrings); 
 Strings用于返回当前主键下各子键的名称。 

  5.获取主键下的数据值名称:procedure GetValueNames(Strings: TStrings)。 
  Strings用于返回当前主键下各数值名称。 
  如要获取当前系统中的拨号连接名称,可利用获取主键HKEY—USERS \.DEFAULT\RemoteAccess\Addresses下的数值名称的方法来进行。 

  6.判断数值名称存在、数值名称改名。 
  ValueExists用于判断数值名称是否存在: 
  function ValueExists(const Name: string): Boolean; 
  返回值为True表示数值名称存在。 
  RenameValue用于数值名称改名: 
  procedure RenameValue(const OldName, NewName: string); 

 以上是注册表常用操作所对应的TRegistry的方法和属性,其它方法和属性请参见Delphi联机帮助文件。 
以上程序在PWIN 98Delphi 3.0下调试通过。 


2003-11-20 11:53:00 
查看评语»»» 
2003-11-20 11:59:20 注册表中对编程常用的几项(ODBC/BDE/Internet/Windows) 

我用的是 WINDOWS 2000, WIN2000 的 REGEDIT 提供了类似 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.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_MACHINE\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 的配置,我就不多说了,大家拿它和 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\Software\Microsoft\Windows\CurrentVersion\Run 
每次该用户启动 WINDOWS 必定执行下面的命令(如果有,当然一般都有), 

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Runonce 
该用户启动 WINDOWS 必定执行下面的命令(如果有),执行完后由 WINDOWS 把命令删掉,安装软件的时候特别有用, 

以上两处是针对特定用户的,在HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion 下还有类似的地方,是针对所有用户的,我就不罗嗦了。 


2003-11-20 12:16:38 Delphi 中注册表构件TRegistry 的应用 

Delphi3.0 及以上版本中,提供了一个构件TRegistry。在程序中可以利用它来实现对WIN95/98/NT 注册表的操作,可以很方便地在注册表中增加、修改和删除键值。这样可以在程序中完成一些特殊的功能。 

---- TRegistry 常用的属性和方法有(具体作用和用法请参考Delphi 帮 
助): 
RootKeyCreateKeyOpenKeyCloseKeyDeleteKeyReadXXXXWriteXXXX 
XXXX表示数据类型如StringInteger等) 
我们用到的属性和方法有: 

RootKey:注册表的根键名HKEY_LOCAL_MACHINE

OpenKey( KeyName:string; CanCreate:boolean ): 
使当前键为KeyNameCanCreate 表示当指定的键不存在时是否创建,True 表示创建 

SetKey( KeyName,KeyValue string ):使键KeyName的值为KeyValue 

---- 应用之一:让自己的程序随WIN95/98/NT 的启动而运行 
当然,你可以在"启动"程序组中加入程序的快捷方式,但这样做好象不大明智,因为大多数程序在安装时不会这样做,而是在通过在注册表增加键值,让WIN95/98/NT 在启动时运行自己的程序。如果打开注册表,找到HKEY_LOCAL_MACHINE \Software \Microsoft\Windows \CurrentVersion \Run,就会发现这个秘密了,原来许多自动运行的程序都在这里。你也可以在这里增加一个键,让你的程序也随着 WIN95/98/NT 的启动而自己运行,成为WINDOWS 下的TSR 程序。实现方法如下: 

首先,在Uses 中加上Registry 单元 

然后,写下面代码。 

{将程序strExeFileName置为自动启动 
function StartUpMyProgram strPrompt,strExeFileName string boolean; 
var 
registerTemp TRegistry; 
begin 
registerTemp := TRegistry.Create; 
//建立一个Registry实例 
with registerTemp do 
begin 
RootKey:=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; 
end 
else result := false; 
//善后处理 
CloseKey; 
Free; 
end; 
end; 

{调用StartUpMyProgram, 
使DelphiWINDOWS启动而自动运行 
procedure TForm1.Button1Click(Sender: TObject); 
begin 
memo1.lines.add('开始'); 
if StartUpMyProgram('delphi','C:\Program Files\borland\delphi3\bin\delphi32.exe') then 
memo1.lines.add('成功') 
else 
memo1.lines.add('失败') 
end; 

---- 应用之二:实现文件关联 
MS WORD 安装在你的系统中时,它会把.DOC 文件与自己关联,当你双击一个DOC 文件,就会启动MS WORD,打开你指定的DOC文件。你也可以把一个文件类型与一个程序关联起来,其秘密还是在注册表中。如果打开注册表,找到HKEY_CLASSES_ROOT,就会发现这里已经有很多文件类型。 
你也可以在这里增加一个键,建立自己的文件关联。 

建立文件关联,一般应有两个步骤: 

(1)根据文件类型的扩展名,指定对应的键名(如doc 文件对应的键为doc_auto_file) 
该键及其子键的值,将定义该类型的文件的类型说明和操作(如打开、编辑)说明 

(2)在指定的键名下,建立子键,指明文件类型说明和操作对应的程序信息 
例如,我们可以为.DBF 文件建立文件关联,其文件类型说明为"xBase 数据表",使其打开(Open)文件的操作对应程序C:\ProgramFiles\Borland\DBD\DBD32.EXE。首先,应在注册表的根键HKEY_CLASSES_ROOT 下建立一个键,键名为.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 "为命令行参数),表示打开操作对应的程序信息。 

具体实现如下:同样,在Uses 中加上Registry 单元 然后,写下面代码。 

{将文件类型strFileExtension与程序 
strExeFileName相关联,strDiscription为文件类型说明 
function AssignToProgram(strFileExtension,strDiscription,strExeFileName string boolean; 
var 
registerTemp TRegistry; 
begin 
registerTemp := TRegistry.Create; 
//建立一个Registry实例 
with registerTemp do 
begin 
RootKey:=HKEY_CLASSES_ROOT; 
//设置根键值为HKEY_CLASSES_ROOT 
//根据文件类型的扩展名,创建或打开对应的键名.FileExt,DBF对应'.DBF' 
if OpenKey( '.' strFileExtension, true then 
begin 
result := false; 
exit; 
end; 
//设置键.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 
begin 
result := false; 
exit; 
end; 
//设置默认值文件类型说明,DBF可对应'xBase数据表
WriteString('',strDiscription); 
CloseKey; 
//创建或打开键名FileExt_Auto_File\Shell\open\command,该键为表示操作为'打开
//'.DBF'对应'DBF_Auto_File\shell\open\command' 
if OpenKey(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; 
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('失败') 
end; 

---- 应用之三:检测Win95/98/NT 系统中是否安装了Borland Database Engine 
当你的应用程序是一个基于BDE 的数据库应用程序时,如果运行在一个没有安装BDE Win95/98/NT 中,会出现让用户迷惑不解的错误。你可能需要在程序正常运行之前,检查系统中是否安装了BDE。由于 BDE 安装后会在注册表进行注册,你可以通过查询注册表来确定系统中是否安装了BDE,然后决定下一步采取什么行动。BDE 在注册表中的位置为: 
HKEY_LOCAL_MACHINE\Software\Borland\Database Engine,该键存在说明 BDE 已经安装。 

具体的例子如下。 

同样,在Uses 中加上Registry 单元 

然后,写下面代码。 

{检测系统中是否安装了BDE 
function IsBDEInstalled boolean; 
var 
registerTemp TRegistry; 
begin 
registerTemp := TRegistry.Create; 
//建立一个Registry实例 
with registerTemp do 
begin 
RootKey:=HKEY_LOCAL_MACHINE; 
//设置根键值为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 
memo1.lines.add('开始'); 
if IsBDEInstalled then 
memo1.lines.add('已安装了BDE') 
else 
memo1.lines.add('未安装BDE') 
end; 

---- 应用之四:在桌面建立程序的快捷方式 
当你的WIN95/98/NT 桌面上整齐地排列着各种程序的快捷方式时,也许你会体会到快捷方式的方便。你也可将自己设计的程序的快捷方式放在别人的桌面上。 

桌面上的一个快捷方式,对应Windows 目录下Destop 子目录中的一个ShellLink 文件(.LNK),你只要在这个目录下增加一个.LNK 文件就可以了。 
我们的任务,主要是利用TRegistry 从注册表中获取Desktop 的实际路径,默认为Windows 目录下的Desktop 子目录,如C:\PWIN98\Desktop。在注册表中Desktop 的实际路径对应的键为HKEY_CURRENT_USER \Software\MicroSoft \Windows \CurrentVersion \Explorer \Shell Folders \Desktop。 

同样,在Uses 中加上Registry 单元 

然后,写下面代码。 

{为程序strExeFileName在桌面建立快捷方式,运行参数为strParameters 
function CreateShortcutOnDesktop( strExeFileName, strParameters string boolean; 
var 
registerTemp TRegistry; 
strDesktopDirectory widestring; 
shelllinkTemp IShellLink; 
persistfileTemp IPersistFile; 
begin 
registerTemp := TRegistry.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',True) then 
//写入自己程序的信息 
begin 
result := false; 
exit; 
end; 
//读取项目Desktop的值,即Desktop的实际路径 
strDesktopDirectory := ReadString('Desktop'); 
//善后处理 
CloseKey; 
Free; 
end; 

//设置快捷方式的参数 
shelllinkTemp := IShellLink( CreateComObject(CLSID_ShellLink)); 
with shelllinkTemp do 
begin 
SetPath( PChar( strExeFileName ); 
//设置程序文件全名 
SetArguments( PChar( strParameters) ); 
//设置程序的命令行参数 
//设置程序的工作目录 
SetWorkingDirectory( Pchar( ExtractFilePath( strExeFileName ); 
end; 

//构造快捷方式的文件名(.LNK) 
strDesktopDirectory := strDesktopDirectory '\' ExtractFileName( strExeFileName ); 
strDesktopDirectory := copy( strDesktopDirectory, 1, length( strDesktopDirectory length( ExtractFileExt( strExeFileName '.LNK'; 

//保存快捷方式的文件 
persistfileTemp := shelllinkTemp 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('开始'); 
if CreateShortcutOnDesktop('C:\Program Files\borland\delphi3\bin\delphi32.exe','%1') then 
memo1.lines.add('成功') 
else 
memo1.lines.add('失败') 
end; 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值