一、創建和釋放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—CONFIG、HKEY—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爲緩衝區大小,返回爲實際讀取的字節數。
其它方法還有:ReadBool、ReadCurrency、ReadDate、ReadDateTime、ReadFloat、ReadTime。
2.讀取信息一例(顯示Windows的版本)。
在HKEY—LOCAL—MACHINE\Software\Microsoft\Windows\CurrentVersion下,有三個字符串值Version、VersionNumber和SubVersionNumber,用於記錄當前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爲緩衝區大小。
其它方法還有:WriteBool、WriteCurrency、WriteDate、WriteDateTime、WriteFloat、WriteTime。
2.寫入信息一例。
下面程序使Delphi隨Windows啓動而自動運行。
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)。
OldName、NewName分別表示源主鍵名和目標主鍵名;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 98+Delphi 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 幫
助):
RootKey、CreateKey、OpenKey、CloseKey、DeleteKey、ReadXXXX、WriteXXXX
(XXXX表示數據類型如String、Integer等)
我們用到的屬性和方法有:
RootKey:註冊表的根鍵名( 如HKEY_LOCAL_MACHINE等)
OpenKey( KeyName:string; CanCreate:boolean ):
使當前鍵爲KeyName,CanCreate 表示當指定的鍵不存在時是否創建,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,
使Delphi隨WINDOWS啓動而自動運行 }
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;