注冊表(Registry,繁體中文版Windows稱之為登錄檔)是Microsoft Windows中的一個重要的數據庫,用於存儲系統和應用程序的設置信息。比如我們打開一個記事本,調整其窗口大小,使用完畢後關閉記事本,下次打開時大小和上次關閉前的大小和在屏幕上的位置是相同。這些位置和大小信息就是在記事本關閉時保存到注冊表中,下次打開時我們從注冊表中取出這些數據,並按照這些數據顯示記事本程序的大小和位置信息。
下面教你如何使用GetProfileInt,WriteProfileInt,GetProfileString,WriteProfileString,SetRegistryKey這5個函數把你想要保存的應用程序信息保存到注冊表中,如何從注冊表中取出來。
UINT WINAPI GetProfileInt( LPCTSTR lpAppName, LPCTSTR lpKeyName, int nDefault); BOOL WriteProfileInt(LPCTSTR lpszSection, LPCTSTR lpszEntry, int nValue); BOOL WINAPI WriteProfileString( LPCTSTR lpAppName, LPCTSTR lpKeyName, LPCTSTR lpString); BOOL WriteProfileInt(LPCTSTR lpszSection,LPCTSTR lpszEntry,int nValue );
上面4個函數是CWinApp類中提供了一組用於讀寫應用程序配置的方法的接口,可方便的用於讀寫應用程序配置。具體的函數聲明和參數解釋可以參考MSDN。
下面就教你如何才能夠把你想要保存的一些信息保存到注冊表中。
1. 用VC++的向導建立基於對話框的MFC項目之後,在CClassApp::InitInstance()函數定義中添加這樣的語句:
SetRegistryKey(_T("應用程序向導生成的本地應用程序"));
該函數將為以上提到的幾個方法建立工作環境,此時如果用WriteProfileInt寫入數據,將會被寫入到如下注冊表位置:
HKEY_CURRENT_USER\Software\應用程序向導生成的本地應用程序\應用程序名稱\
你可以打開注冊表查看一下是否有了對應的鍵值項。
如果在InitInstance中不執行SetRegistryKey,則用WriteProfileInt寫入數據時,將寫入到%windir%\應用程序名稱.ini中。
2. 向注冊表中寫入需要保存的數據
a. 如果在InitInstance中執行了SetRegistryKey("應用程序向導生成的本地應用程序"); 則對於:
WriteProfileInt("section","val1",10);
將在注冊表中如下路徑寫入數據:
[HKEY_CURRENT_USER\Software\應用程序向導生成的本地應用程序\應用程序名稱\section] "val1"=dword:0000000a
b. 如果在InitInstance中沒執行SetRegistryKey 則對於:
WriteProfileInt("section","val1",10);
將在“%windir%\測試應用程序.ini”中寫入:
[section]
val1=10
3.從注冊表中讀取需要的值
GetProfileInt("section","val1",10);
最後一個參數是默認值,如果沒有從注冊表中取得任何值,將使用這個默認的值。
對於取得字符串類型的值用法大致相同使用的是GetProfileString和WriteProfileString接口。
下面是一個測試例程,你可以放到工程中測試一下!
先在CTestClassApp::InitInstance()中添加SetRegistryKey函數
BOOL CTestClassApp::InitInstance() { SetRegistryKey(_T("Test Regedit Solutions")); AfxEnableControlContainer(); ............. //此處代碼省略 ............. return FALSE; }
可以在對話框的OK按鈕的響應函數中添加下面的測試代碼
void CTestClassDlg::OnOK() { AfxGetApp()->WriteProfileInt("Settings", "Int", 21); AfxGetApp()->WriteProfileString("Settings", "String", _T("Welcome you come here!")); int nGetInt = AfxGetApp()->GetProfileInt("Settings", "Int", 21); CString strGetString = AfxGetApp()->GetProfileString("Settings", "String", _T("Welcome you come here!")); TCHAR szBuffer[256]; wsprintf(szBuffer,_T("int:%d string:%s"),nGetInt,strGetString); AfxMessageBox(szBuffer); //CDialog::OnOK(); }
運行程序點擊OK按鈕彈出對話框
取得的值和我們程序中寫入的值相同。
讓後在查找程序中輸入regedit打開注冊表,按上面的路徑找到響應的位置,查看鍵值和對應的數據如下圖所示
發現保存的值也是正確的。
有了這些我們就可以在注冊表中保存我們需要保存的一些簡單的程序配置信息數據了。