一、說明:
註冊表是Windows重要組成部分,註冊表記錄了大量有關電腦軟硬件的信息。註冊表中的值通過其名稱標識。值名稱由與鍵名相同的字符組成。值本身可以是字符串、二進制數據或者是32位無符號值。在這裏我們主要運用以下技巧:
(一)、預定義的註冊表鍵。註冊表包含了幾個預定義鍵:
- HKEY_LOCAL_MACHINE 包含描述計算機及其配置的條目。其中包括關於處理器、系統主板、內存和已安裝的軟件和硬件的信息。
- HKEY_CLASSES_ROOT 是與文檔類型和 OLE\COM 相關的信息的支持鍵。這個鍵是 HKEY_LOCAL_MACHINE的從屬鍵。
- HKEY_USERS 用作默認用戶首選設置,也作爲單個用戶的首選設置。
- HKEY_CLASSES_USER 是用於當前(登錄)用戶的相關信息。
- HKEY_CURRENT_CONFIG 包含了當前系統配置的信息。
- 還有一個,一般不會出現,只有配置的局域網後纔會有。
- 所需要頭文件:atlbase.h
- 常用函數
☆ 打開一個鍵的函數:RegOpenKeyEx 函數定義:LONG RegOpenKeyEx(HKEY hKey,//已經打開的鍵的句柄,或者直接是上述幾個根鍵 LPCTSTR lpSubKey,//要打開的子鍵名字的地址 DWORD ulOptions,//保留值,必須爲0 REGSAM samDesired,//打開方式,如讀還是寫 PHKEY phkResult//返回的打開的子鍵的句柄 ); ☆ 查詢某一個鍵值:RegQueryValueEx 函數定義:LONG RegQueryValueEx(HKEY hKey,//要查詢的鍵的句柄 LPCTSTR lpValueName,//要查詢的鍵值的名稱 LPDWORD lpReserved,//保留值 LPDWORD lpType,//要查詢的數據的類型 LPBYTE lpData,//要返回的查詢的數據 LPDWORD lpcbData//預置的數據的長度 ); ☆ 設置一個鍵值RegSetValueEx 函數定義:LONG RegSetValueEx(HKEY hKey,//要設置的鍵的句柄 LPCTSTR lpValueName,//要訪問的鍵值的名稱 LPDWORD lpReserved,//保留值 DWORD dwType,//要設置的數據的類型 const BYTE *lpData,//要設置的健值 DWORD cbData//數據的長度 );
- 通過AppWizard創建基於對話框的程序 Regedit
- 設置兩個命令按鈕,名爲“查詢”(ID_QUERY)和“修改”(ID_CHANGE),用來查詢和修改註冊表中用戶姓名和公司名稱。 注:信息位置9x系列:\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrntVersion NT系列:\HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrntVersion 鍵值:RegisteredOwnertkg和RegisteredOrganization分別表示用戶名和公司名
- 設置兩個編輯框,用於顯示和修改信息。定義兩個CString變量m_strOwner,m_Company。
- “查詢”按鈕代碼如下:
void CRegeditDlg::OnQuery() { UpdateData(true); HKEY hKEY;//定義有關的hKEY,在查詢結束時要關閉 //打開與路徑 data_Set相關的hKEY LPCTSTR data_Set="Software\\Microsoft\\Windows NT\\CurrentVersion\\"; //訪問註冊表,hKEY則保存此函數所打開的鍵的句柄 long ret0=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set,0,KEY_READ,&hKEY)); if(ret0!=ERROR_SUCCESS)//如果無法打開hKEY,則中止程序的執行 { AfxMessageBox("錯誤:無法打開有關的hKEY"); return; } //查詢有關的數據 LPBYTE owner_Get=new BYTE[80];//定義用戶姓名 owner_Get DWORD type_1=REG_SZ;//定義數據類型 DWORD cbData_1=80;//定義數據長度 long ret1=::RegQueryValueEx(hKEY,"RegisteredOwner",NULL,&type_1,owner_Get,&cbData_1); if(ret1!=ERROR_SUCCESS) { AfxMessageBox("錯誤:無法查詢有關的註冊表信息"); return; } //查詢公司名 LPBYTE company_Get=new BYTE[80];//定義公司名稱 company_Get DWORD type_2=REG_SZ;//定義數據類型 DWORD cbData_2=80;//定義數據長度 long ret2=::RegQueryValueEx(hKEY,"RegisteredOrganization",NULL,&type_2,company_Get,&cbData_2); if(ret2!=ERROR_SUCCESS) { AfxMessageBox("錯誤:無法查詢有關的註冊表信息"); return; } //顯示信息 m_strOwner=CString(owner_Get); m_strCompany=CString(company_Get); delete[] owner_Get; delete[] company_Get; //程序結束,關閉打開的hKEY ::RegCloseKey(hKEY); UpdateData(false); }
- “設置”按鈕代碼如下:
void CRegeditDlg::OnModify() { UpdateData(true); HKEY hKEY;//定義有關的hKEY,在查詢結束時要關閉 //打開與路徑 data_Set相關的hKEY LPCTSTR data_Set="Software\\Microsoft\\Windows NT\\CurrentVersion\\"; //訪問註冊表,hKEY則保存此函數所打開的鍵的句柄 long ret0=(::RegOpenKeyEx(HKEY_LOCAL_MACHINE,data_Set,0,KEY_READ,&hKEY)); if(ret0!=ERROR_SUCCESS)//如果無法打開hKEY,則中止程序的執行 { AfxMessageBox("錯誤:無法打開有關的hKEY"); return; } //設置有關的數據 //CString_To_LPBYTE,請參考下面的函數 LPBYTE owner_Set=CString_To_LPBYTE(m_strOwner);//定義用戶姓名 owner_Set DWORD type_1=REG_SZ;//定義數據類型 DWORD cbData_1=m_strOwner.GetLength()+1;//定義數據長度 long ret1=::RegSetValueEx(hKEY,"RegisteredOwner",NULL,type_1,owner_Set,cbData_1); if(ret1!=ERROR_SUCCESS) { AfxMessageBox("錯誤:無法設置有關的註冊表信息"); return; } //查詢公司名 LPBYTE company_Set=CString_To_LPBYTE(m_strCompany);//定義公司名稱 company_Set DWORD type_2=REG_SZ;//定義數據類型 DWORD cbData_2=m_strCompany.GetLength()+1;//定義數據長度 long ret2=::RegSetValueEx(hKEY,"RegisteredOrganization",NULL,type_2,company_Set,cbData_2); if(ret2!=ERROR_SUCCESS) { AfxMessageBox("錯誤:無法設置有關的註冊表信息"); return; } else { AfxMessageBox("註冊表修改完成"); } //程序結束,關閉打開的hKEY ::RegCloseKey(hKEY); UpdateData(false); }
- 參考函數
LPBYTE CString_To_LPBYTE(CString str) { LPBYTE lpb=new BYTE[str.GetLength()+1]; for(int i=0;i<str.GetLength();i++) lpb[i]=str[i]; lpb[str.GetLength()]=0; return lpb; }
三、注意:以上代碼僅能在Windows NT/2000/XP中通過,Windows 9X/Me中請將註冊表路徑中的Windows NT改爲Windows即可實現。 本程序源代碼在Windows 2000+VC6.0中通過測試。 本程序源代碼示例文件僅能在 Windows NT/2000/XP 下使用,Windows 9X/Me 中請修改後使用。
原文地址:http://blog.csdn.net/z397164725/article/details/7403344