用CB控制Windows註冊表

來源:互聯網
上載者:User

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++強大的類庫,我們可以很輕鬆地完成這個工作。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.