1. 程式人生 > >使用API對登錄檔進行讀寫

使用API對登錄檔進行讀寫

   首先明確一下HKEY的概念。從字面上看它是一個Key的控制代碼。讀寫位置的確定就靠它了。開啟登錄檔編輯器("regedit"),裡面的HKEY_CURRENT_USER還有HKEY_LOCAL_MACHINE這些是不是HKEY控制代碼呢?必然是啊,都HKEY打頭了......       明確這個之後,一些問題就好解決了。所有的登錄檔操作都需要HKEY控制代碼,但形式不太一樣。     比如我想在LOCAL_MACHINE下新增一個鍵值,RegCreateKey函式第二個引數是子鍵值,好了,我想寫多少層就寫多少層。     同樣,建立預設鍵也有子鍵值這個引數。但是建立普通鍵就沒有子鍵值,所以要想辦法得到一個確切的HKEY。這就要用到RegOpenKey了。另外RegCreateKey的第三個引數也可以得到。
    上程式碼......  
void CSetRegDlg::OnSetReg() 
{
	HKEY hKey;
	RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\FansyReg\\test",&hKey);
	RegSetValue(hKey,NULL,REG_SZ,"asdf",strlen("asdf"));
	//等效於前兩行的寫法,另外相同欄位會覆蓋
	RegCreateKey(HKEY_LOCAL_MACHINE,"Software\\FansyReg",&hKey);
	RegSetValue(hKey,"test",REG_SZ,"asd",strlen("asd"));

	DWORD dwAge = 30;
	RegSetValueEx(hKey,"age",0,REG_DWORD,(BYTE*)&dwAge,sizeof(DWORD));
	RegCloseKey(hKey);
}

void CSetRegDlg::OnGetReg() 
{
	LONG lvalue;
	LONG res = RegQueryValue(HKEY_LOCAL_MACHINE,"Software\\FansyReg\\test",NULL,&lvalue);
	if (res != ERROR_SUCCESS)
	{
		return ;
	}
	char *pBuf = new char[lvalue];
	RegQueryValue(HKEY_LOCAL_MACHINE,"Software\\FansyReg\\test",pBuf,&lvalue);
	HKEY hKey;
	LONG res1 =	RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\FansyReg\\test",&hKey);
	DWORD dwAge = 0;
	DWORD dwLength; //不知為何不允許初始化
	res = RegQueryValueEx(hKey,"age",NULL,NULL,(LPBYTE)&dwAge,&dwLength);//最後一個引數不允許為空
	if (res != ERROR_SUCCESS)
	{
		return ;
	}
	CString str;
	str.Format("default value is %s, age = %d",pBuf,dwAge);	
	MessageBox(str);
	delete pBuf;
	pBuf = NULL;
}