註冊表簡介
有時程式中要存些設定資訊,一個方法就是建立一些普通的txt或xml檔案,然後儲存進去就行了.另一辦法就是儲存到註冊表裡.註冊表是由windows維護的一個小資料庫.裡面也會儲存windows本身的很多配置資訊.
我們在命令列通過regedit可以手動開啟註冊表查看相關資訊.在頁面上我們會看到左邊有很多樹形結構的內容,我們可以簡單的把它等同於目錄.最頂端的5個根鍵所包括的內容分別是
1.)HKEY_CLASSES_ROOT
定義了系統中所有檔案類型標誌和基本操作標誌.
2.)HKEY_CURRENT_USER
目前使用者的配置資訊,包括環境變數、案頭設定、網路連接,軟體運行資訊等
3.)HKEY_LOCAL_MACHINE
本機相關的系統資訊,包括硬體資訊,驅動資訊,記憶體資料,匯流排資料等等。
4.) HKEY_USER
這裡記錄了本機器上所有使用者的設定
5.)KKEY_CURRENT_CONFIG
包括字型、BIOS、作業系統、印表機等四項的配置資訊。該欄位是HKEY_LOCAL_MACHINE\Config的副本
其中1,4,5,項根鍵我們一般只是讀取一些資訊.而2,3兩項根鍵下就會寫入一些應用程式自己的配置資訊.所以用的最多的是這兩個位置
HKEY_CURRENT_USER \ SOFTWARE
HKEY_LOCAL_MACHINE \ SOFTWARE
應用程式配置資訊一般儲存在哪裡
剛說了我們一般在HKEY_LOCAL_MACHINE,HKEY_CURRENT_USER這兩個下面放自己應用程式的配置資訊.那這兩者有啥區別呢?
放在HKEY_CURRENT_USER中的資訊只有目前使用者能看到,如果log off換個使用者就不到了.而放HKEY_LOCAL_MACHINE下面的資訊所有使用者都能看到.
不過我們平時自己一個人用的電腦基本上也不會去整多個使用者登陸.這時配置資訊隨便放哪在我們看來貌似一樣的.
不過開啟註冊表一看我們發現平時用的大部分軟體都是把配置資訊放HKEY_CURRENT_USER\ SOFTWARE下.
當然如果你想寫些其他資訊不想被別人很容易找到的,可以找個啥偏點的地方藏起來啊.
註冊表索引值內容
我們看到的那一層層樹形結構,就像一個個目錄一樣,它本身就是起組織內容的作用.而我們真正需要的資訊是在目錄的最後一層.開啟後我們會在右邊看到三列
Name , Type , Data 其中的Type只是起描述作用,協助你理解.所以真正用到的是Name , Data看到兩個值想到MFC中的CMap類了吧,name就是鍵名,data是索引值.
我猜windows儲存註冊表裡的資訊時就用CMap這樣的類型的.
這裡的Type我們也可以看成程式設計語言中的資料類型,Name就是變數名,Data是變數的值.註冊表裡常用的類型是REG_SZ,可以簡單的看成是個字串像Char* 或者CString這樣的.
另一個是REG_DWORD,這儲存的是數值,就可以看成DWORD (unsigned long)
MFC中操作註冊表主要是CRegKey這個類.
CRegKey的用法
建立函數
有點類似於建立一個目錄供往裡面寫檔案一樣.
CRegKey key;
key.Create(HKEY_CURRENT_USER, _T("SOFTWARE\\ArwenSoft"));
key.Close();
開啟並添加值
int iMaxNumber = 100;
BOOL bOpenReg = key.Open(HKEY_CURRENT_USER, _T("SOFTWARE\\ArwenSoft"));
//實際上我們有時真需要把密碼儲存到註冊表時可不能明碼儲存,先得把密碼加密後再儲存,讀取時再解密.
key.SetStringValue(_T("Password"), _T("123"));
key.SetDWORDValue(_T("count"),iMaxNumber);
key.Close();
查看註冊表資訊
DWORD dwNum;
BOOL bOpenReg = key.Open(HKEY_CURRENT_USER, _T("SOFTWARE\\ArwenSoft"));
key.QueryDWORDValue(_T("count"),dwNum); //或者key.QueryValue(dwNum,_T("count"));
刪除資訊
key.DeleteValue(_T("count"));
MFC操作註冊表便捷方式
除了使用CRegKey類直接操作註冊表,MFC架構還提供了個便捷的方式.
MFC的進入點,繼承自CWinApp的那個類中有個InitInstance函數.我們建立一個project時,該函數預設產生這樣一行代碼
SetRegistryKey(_T("Local AppWizard-Generated Applications"));
這裡就是在HKEY_CURRENT_USER \ SOFTWARE 下面建立一個項.你可以把名字改成其他任意值.比如注釋掉上面那行代碼,改成這樣
SetRegistryKey(_T("ArwenProduct"));
在這裡這樣設定後,以後查看或往註冊表添加資訊就非常簡單了.
往註冊表寫資訊就是
WriteProfileString(_T("Settings"),_T("Password"),_T("123"));
//寫入字串值
WriteProfileInt(_T("settings"),_T("count"),123);
//寫入數字
其中第一個參數相當於在前面的ArwenProduct下面再產生新的項,.然後第二個參數是值名,第三個是索引值.當然如果你還想多幾層項,可以樣
WriteProfileString(_T("ConfigInfo\\Settings"),_T("Password"),_T("123"));
//寫入字串值
讀取註冊表資訊
CString strPwd = GetProfileString(_T("settings"),_T("pwd"));
int num = GetProfileInt(_T("settings"),_T("count"));
不過這些函數是CWinApp的成員函數.在其他地方用,得這樣
AfxGetApp()->GetProfileString
AfxGetApp()可以得CWinApp的指標