Windows注冊表中包含了配置、機器硬件配置、Win32應用程序和用戶的其他配置信息。注冊表根據系統信息分為六個根鍵(RootKey),其中每個根鍵各有一個由子鍵和鍵值組成的樹狀結構,每個子鍵代表一個特定的配置項目。
用C++Builer控制注冊表的關鍵在於了解TRegistry 類。在C++Builder的VCL類庫中,提供了TRegistry類,通過在應用程序中生成這個類的實例,我們可以實現對注冊表的控制。在TRegistry類中,重點應該掌握如下問題:
1.TRegistry類的生成
我們不能用直接聲明的方法生成TRegistry的實例,這與VC++中用HKEY直接生成實例的方法不同。必須采用new關鍵字生成TRegistry 類的實例,然後將指針傳遞給聲名的變量。具體操作如下:
TRegistry * curReg=new TRegistry;//curReg是 TRegistry類型的指針名
采用這個方式聲明後,curReg的RootKey屬性指向 HKEY_CURRENT_USER根鍵,即默認操作是針對HKEY_CURRENT_USER進行的。
2.如何打開和關閉主鍵
TRegistry類提供了兩個成員函數打開一個主鍵: OpenKey()和OpenKeyReadOnly()函數。其中,OpenKey函數同時提供了創建主鍵的功能。
OpenKey()有兩個參數,KeyName和canCreate。canCreate 是一個bool型參數,當它設置成true時,如果當前根鍵下不存在AnsiString類的變量 KeyName所指出的主鍵,則創建這個主鍵;否則進入KeyName指出的主鍵。如果canCreate 設置成false,而當前根鍵下沒有KeyName指出的主鍵,則函數返回false。
OpenKeyReadOnly()函數的功能是以只讀方式打開一個主鍵,如果參數值是NULL,則指向RootKey指明的鍵。
KeyName參數有兩種表示方法:絕對路徑表示和相對路徑表示。采用絕對路徑表示時,串值必須以“\\"開頭;采用相對路徑則表示KeyName指明的主鍵是相對於當前主鍵而言的。
在注冊表使用完畢後,應當及時調用CloseKey()成員函數關閉注冊表,並調用delete方法將用new申請的內存空間釋放。
3.關於當前主鍵下子鍵值的獲取
我們可以用GetKeyNames()成員函數得到當前主鍵下所有子鍵的名稱,用GetKeyInfo得到更加詳細的信息。
必須指出,雖然GetKeyNames()的說明成void __fastcall GetKeyNames(Classes::TStrings * Strings),也就是說,它的參數類型是TString,但是我們並不能首先聲明一個TString類的實例,然後將它作為參數用於GetKeyNames()。這主要是由於TStrings類含有抽象成分。我們的解決方法是采用TStrings類的派生類TStringList來代替TStrings聲明一個實例,並作為參數用於GetKeyNames()函數。
在獲得子鍵的名稱後,我們就可以利用有關函數進一步確定詳細信息。例如,我們可以用GetValueNames()結合Read()和 Write()獲得主鍵的值的詳細信息。例如:我們要讀“\Software\Sybase”中的 “Location”串值的信息,可以執行如下操作:
curReg->OpenKey(“\\Software\\Sybase",true);
AnsiString ValueInfo=CurReg->ReadString(“Location");
這時,ValueInfo就獲得了Location的值。
4.關於屬性的說明
TRegistry類的一個主要屬性是LazyWrite。這個屬性的作用是決定是否在執行寫操作之後立即將所做的改動反映到實際的注冊表中。這個屬性的值在注冊表對象構造時初始化為true,即不立即將所做的改動反映到實際的注冊表中,而是在執行CloseKey()函數之後重寫注冊表,這樣可以提高系統性能。但是,如果我們需要將修改立即反映到注冊表(這在許多場合是必要的),則應當首先將LazyWrite屬性設置為false,然後執行修改操作。
另一個值得一提的屬性是RootKey,這個屬性規定了當前操作的對象是哪一個根鍵,默認為HKEY_CURRENT_USER。如果需要對其他根鍵進行操作,直接將目標根鍵的值賦給RootKey屬性即可。
下面請看我們的程序中的一個實際片段,這個例子的功能是將“\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;
…………
由此看來,在C++Builder環境下控制注冊表的問題並不復雜,利用C++強大的類庫,我們可以很輕松地完成這個工作。