VC中簡單操作登錄檔

2021-04-12 15:29:09 字數 4748 閱讀 1531

本文只是對登錄檔實現簡單的開啟、建立、讀、寫、關閉操作,故只是基本知識的介紹,適合不能熟練使用登錄檔操作的初級讀者。

(我把本文放在這裡,其實最主要的目的是怕自己以後忘了,畢竟我也不常用這方面的知識,好不容易弄懂了點點,就趕快存起來,呵呵^_^)

一、說明:

登錄檔是windows重要組成部分,登錄檔記錄了大量有關電腦軟硬體的資訊。登錄檔中的值通過其名稱標識。值名稱由與鍵名相同的字元組成。值本身可以是字串、二進位制資料或者是32位無符號值。在這裡我們主要運用以下技巧:

(一)、預定義的登錄檔鍵。登錄檔包含了幾個預定義鍵:

1. hkey_local_machine  包含描述計算機及其配置的條目。其中包括關於處理器、系統主機板、記憶體和已安裝的軟體和硬體的資訊。  

2. hkey_classes_root   是與文件型別和 ole/com 相關的資訊的支援鍵。這個鍵是 hkey_local_machine的從屬鍵。  

3. hkey_users          用作預設使用者首選設定,也作為單個使用者的首選設定。  

4. hkey_classes_user   是用於當前(登入)使用者的相關資訊。  

5. hkey_current_config 包含了當前系統配置的資訊。  

6. 還有乙個,一般不會出現,只有配置的區域網後才會有。  

(二)、vc中兩種登錄檔操作方法

在vc中,主要有兩種方法可以實現登錄檔的操作,一是使用mfc封裝的類cregkey,該類包含了14個成員函式,它們可以實現登錄檔的簡單操作(基本的如本文提到的「開啟、建立、讀、寫、關閉」等);二是使用windows api函式。當然,對我來說,能使用底層的,那為什麼不用呢,畢竟我現在是程式設計師,使用底層函式,可以移植到更多的開發平台中嘛。

1.所需要標頭檔案:atlbase.h  

該種方法可以使用類cregkey中的成員函式來完成。先包含標頭檔案,再申明乙個類物件cregkey rkey;然後就可以呼叫成員函式來操作了。

基本功能的成員函式:

long open(hkey hkeyparent, lpctstr lpszkeyname,regsam samdesired = key_all_access);

long close();

long create(hkey hkeyparent, lpctstr lpszkeyname,

lptstr lpszclass = reg_none, dword dwoptions = reg_option_non_volatile,

regsam samdesired = key_all_access,

lpsecurity_attributes lpsecattr = null,

lpdword lpdwdisposition = null);

long setvalue(dword dwvalue, lpctstr lpszvaluename);

long setvalue(lpctstr lpszvalue, lpctstr lpszvaluename = null);

long queryvalue(dword& dwvalue, lpctstr lpszvaluename);

long queryvalue(lptstr szvalue, lpctstr lpszvaluename, dword* pdwcount);

其他幾個:

long setkeyvalue(lpctstr lpszkeyname, lpctstr lpszvalue, lpctstr lpszvaluename = null);

static long winapi setvalue(hkey hkeyparent, lpctstr lpszkeyname,lpctstr lpszvalue, lpctstr lpszvaluename = null);

hkey detach();

void attach(hkey hkey);

long deletesubkey(lpctstr lpszsubkey);

long recursedeletekey(lpctstr lpszkey);

long deletevalue(lpctstr lpszvalue);

但是本文主要介紹使用windows api函式來操作登錄檔,所以這裡不詳細的介紹這些成員函式的用法了。

2. windows api函式個數比較多,一共有

三、四十個,這裡主要介紹幾個常用的函式,來實現本文所說的基本功能即可。

常用api函式

☆ 開啟乙個鍵的函式:regopenkeyex

函式定義:long regopenkeyex(hkey hkey,//已經開啟的鍵的控制代碼,或者直接是上述幾個根鍵

lpctstr lpsubkey,//要開啟的子鍵名字的位址

dword uloptions,//保留值,必須為0

regsam samdesired,//開啟方式,如讀還是寫

phkey phkresult//返回的開啟的子鍵的控制代碼

);說明:如果指定的要開啟的子鍵不存在,則返回失敗;反之返回成功error_success;

☆ 建立乙個鍵的函式:regcreatekeyex

函式定義:long regcreatekeyex(hkey hkey,//已經開啟的鍵的控制代碼,或者直接是上述幾個根鍵

lpctstr lpsubkey,//要建立的子鍵名字的位址

dword uloptions,//保留值,必須為0

regsam samdesired,//開啟方式,如讀還是寫

phkey phkresult//返回的建立的子鍵的控制代碼

);說明:如果指定的要建立的子鍵已經存在,則開啟該子鍵;反之建立該子鍵。函式成功則返回error_success;

該子鍵可以一次建立多層子鍵,格式為「子鍵1層//子鍵2層//子鍵3層。。。」

☆ 查詢某乙個鍵值:regqueryvalueex

函式定義:long regqueryvalueex(hkey hkey,//要查詢的鍵的控制代碼

lpctstr lpvaluename,//要查詢的鍵值的名稱

lpdword lpreserved,//保留值,必須為0

lpdword lptype,//要查詢的資料的型別,如果不關心,可以為null

lpbyte lpdata,//要返回的查詢的資料

lpdword lpcbdata//預置的資料的長度,理論上可以為null,但實際我發現不行,最好設乙個值

);☆ 設定乙個鍵值regsetvalueex

函式定義:long regsetvalueex(hkey hkey,//要設定的鍵的控制代碼

lpctstr lpvaluename,//要訪問的鍵值的名稱

lpdword lpreserved,//保留值

dword dwtype,//要設定的資料的型別

const byte *lpdata,//要設定的健值

dword cbdata//資料的長度

);說明:如果要寫入的資料已經存在,只是改變值而已;如果不存在,則新建子鍵並存值。

二、例子

我做了一些登錄檔的簡單操作,主要是開啟,如果開啟失敗,則建立;然後存值;

hkey key;

cstring strname = "hello";

cstring strcompany = "world";

cstring strseries = "1111-1111";

bool g_bislicesed = true;

verify(!regsetvalueex(hkey, _t("licesedbool"), 0, reg_dword, (byte *)&g_bislicesed, 4));

verify(!regsetvalueex(hkey, _t("user name"), 0, reg_sz, (byte *)strname.getbuffer(strname.getlength()), 50));

verify(!regsetvalueex(hkey, _t("company name"), 0, reg_sz, (byte *)strcompany.getbuffer(strcompany.getlength()),25));

verify(!regsetvalueex(hkey, _t("license code"), 0, reg_sz, (byte *)strseries.getbuffer(strseries.getlength()), 20));

regclosekey(hkey);

另外,我還做了登錄檔的讀取操作

unsigned char  chbuf[50];

cstring strcompany = "";

cstring strseries = "";

hkey  hkey;

dword type(0);

dword len(50);

memset(chbuf, 0, sizeof(chbuf));

if (!regqueryvalueex(hkey, _t("company name"), 0, &type, chbuf, &len))

if (!regqueryvalueex(hkey, _t("license code"), 0, &type, chbuf, &len))

if (!regqueryvalueex(hkey, _t("licesedbool"), 0, &type, chbuf, &len))

regclosekey(hkey);

}   

先就到這裡吧,如果要求不是很高的話,就「依葫蘆畫瓢」,基本可是實現本文所說的功能了。

如果有朋友來看了本文,而你又有更詳盡更使用的東東,請貼上來,不盡感謝!

VC中簡單操作登錄檔

還特別說明一點,就是從登錄檔中取值的時候,一定記得 regqueryvalueex hkey,t licesedbool 0,type,chbuf,len 函式中的引數len,它的大小必須能夠容納要取的值的記憶體大小。也就是說,比如要取乙個字串,長為100,那麼,你在呼叫該函式前必須為len定義乙個...

VC操作登錄檔

1.vc讀取登錄檔資訊 hkey hkey lpctstr data set software yeete s long ret5 regopenkeyex hkey local machine,data set,0,key write key read,hkey long ret0 regdele...

VC操作登錄檔

vc操作登錄檔 邵盛松 2010 3 2 新增標頭檔案atlbase.h 寫入登錄檔鍵值 以設定字串值為例 cstring strpath t c name.exe cregkey key if key.create hkey local machine,t software microsoft w...