vc++高級班之註冊表篇[2]---註冊表中鍵的相關操作

vc++高級班之註冊表篇[2]---註冊表中鍵的相關操作
----------------------------------------------------------------------------------------
①、鍵信息的獲取:用到的API函數:RegQueryInfoKey
void CRegTestDlg::OnBnClickedBtn()
{
HKEY hKey = NULL;
TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet == ERROR_SUCCESS) {
DWORD dwSubKeys = 0, maxSubKeyLen = 0, dwValueCount = 0, maxValueNameLen = 0, maxValueDataLen = 0;
lRet = RegQueryInfoKey(hKey, NULL, NULL, NULL, &dwSubKeys, &maxSubKeyLen, NULL, &dwValueCount, &maxValueNameLen, &maxValueDataLen, NULL, NULL);
if (lRet == ERROR_SUCCESS) {
//
}
}
}
===================================================
②、子鍵的枚舉操作:用到的API函數:RegEnumKeyEx
在進行子鍵的枚舉操作時,要藉助剛纔給大家講解的 RegQueryInfoKey 函數!
void CRegTestDlg::OnBnClickedBtn()
{
HKEY hKey = NULL;
TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet == ERROR_SUCCESS) {
DWORD dwSubKeys = 0, maxSubKeyLen = 0, dwValueCount = 0, maxValueNameLen = 0, maxValueDataLen = 0;
lRet = RegQueryInfoKey(hKey, NULL, NULL, NULL, &dwSubKeys, &maxSubKeyLen, NULL, &dwValueCount, &maxValueNameLen, &maxValueDataLen, NULL, NULL);
if (lRet == ERROR_SUCCESS) {
//Enum for the sub keys
DWORD dwNameLen = maxSubKeyLen+1;
TCHAR *pszName = new TCHAR[maxSubKeyLen+1];
for (DWORD dwIndex = 0; dwIndex < dwSubKeys; ++dwIndex) {


ZeroMemory(pszName, dwNameLen);
dwNameLen = maxSubKeyLen+1; //※※※


RegEnumKeyEx(hKey, dwIndex, pszName, &dwNameLen, NULL, NULL, NULL, NULL);
//Other operations
}
delete [] pszName;
}
RegCloseKey(hKey);
}
}
===================================================
③、鍵的備份與恢復:
備份:RegSaveKey:第二個參數 lpFile 爲保存信息的文件名稱,這個文件必須是不存在的
void CRegTestDlg::OnBnClickedBtn()
{
HKEY hKey = NULL;
TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
EnableTargetPriv(SE_BACKUP_NAME);
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet == ERROR_SUCCESS) {
lRet = RegSaveKey(hKey, _T("C:\\123"), NULL);
RegCloseKey(hKey);
}
}




恢復:RegRestoreKey:
void CRegTestDlg::OnBnClickedBtn()
{
HKEY hKey = NULL;
TCHAR *lpszSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run");
EnableTargetPriv(SE_RESTORE_NAME);
LONG lRet = RegOpenKeyEx(HKEY_LOCAL_MACHINE, lpszSubKey, 0, KEY_ALL_ACCESS, &hKey);
if (lRet == ERROR_SUCCESS) {
LPCTSTR lpszFile = _T("C:\\123");
lRet = RegRestoreKey(hKey, lpszFile, REG_FORCE_RESTORE);
RegCloseKey(hKey);
}
}


#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@#@
BOOL EnableTargetPriv(LPTSTR lpszPrivilege)
{
HANDLE hToken = NULL;
TOKEN_PRIVILEGES tkp = {0};
if ( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) ) {
return FALSE;
}
if ( !LookupPrivilegeValue( NULL, lpszPrivilege, &tkp.Privileges[0].Luid ) ) {
CloseHandle( hToken );
return FALSE;
}
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;


if ( !AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof(TOKEN_PRIVILEGES), NULL, NULL ) ) {
CloseHandle( hToken );
return FALSE;
}
return TRUE;
}
===================================================
※※※ 小作業:
1、實踐本節課給大家講解的各個 API 函數的使用;
2、時間允許的話,大家可以以樹形控件爲例,枚舉指定註冊表鍵下的子鍵,用樹形控件進行顯示!
------------------------------------- End -------------------------------------------
發佈了4 篇原創文章 · 獲贊 21 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章