古詩詞大全網 - 成語解釋 - C++Builder註冊表編程實例詳解

C++Builder註冊表編程實例詳解

壹、註冊表編程詳解

 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 ):

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-);

 將讀取鍵值 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) ;

 我們可以用該成員函數得到當前主鍵下所有子鍵的名稱,用 GetKeyInfo 得到更加詳細的信息。必須指出,雖然 GetKeyNames() 的說明成 void __fastcall GetKeyNames(Classes::TStrings * Strings) ,也就是說,它的參數類型是 TString ,但是我們並不能首先聲明壹個 TString 類的實例,然後將它作為參數用於 GetKeyNames() 。這主要是由於 TStrings 類含有抽象成分。我們的解決方法是采用 TStrings 類的派生類 TStringList 來代替 TStrings 聲明壹個實例,並作為參數用於 GetKeyNames() 函數。

 在獲得子鍵的名稱後,我們就可以利用有關函數進壹步確定詳細信息。如用我們可以用 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 程序的功能。