使用API對登錄檔進行讀寫
阿新 • • 發佈:2019-01-04
首先明確一下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; }