注册表"/>
C/C++ 实现读写注册表
读注册表
// 初始化HKEY hKey_return = NULL;// 打开注册表失败if(ERROR_SUCCESS != RegOpenKeyEx(HKEY_LOCAL_MACHINE, // 注册表根键句柄(也可以是 HKEY_CLASSES_ROOT、HKEY_CURRENT_USER、HKEY_USERS、HKEY_CURRENT_CONFIG) 去掉第一个参数后的注册表路径, // 注册表路径(开头无'\',结尾有'\')0, // 保留KEY_READ, // 只读&hKey_return // 接收打开键的指针(RegQueryValueEx 会用到))){cout << "RegOpenKeyEx failed." << endl;return false;}// 打开键失败char keyValue[256];DWORD keySzType;DWORD keySize;if(ERROR_SUCCESS != RegQueryValueEx(hKey_return, // 由 RegOpenKeyEx 返回注册表键名, // 键名0, // 不定义值类型&keySzType, // 接收键类型(LPBYTE)&keyValue, // 接收键值&keySize // 接收键值的字节大小)){cout << "RegQueryValueEx failed." << endl;return false;}// 打印注册表键值cout << keyValue << endl;
写注册表: 这是一个例子,有多余的代码。功能大概是遍历了某个注册表键下的所有键值,酌情修改其中的某个数据 😄
BOOL CDesktopController::CheckShellFloders()
{std::map<std::wstring, std::wstring> mapShellFolders = {{L"AppData", L"%USERPROFILE%\\AppData\\Roaming"},{L"Cache", L"%USERPROFILE%\\AppData\\Local\\Microsoft\\Windows\\INetCache"},{L"Cookies", L"%USERPROFILE%\\AppData\\Local\\Microsoft\\Windows\\INetCookies"},{L"Desktop", L"%USERPROFILE%\\Desktop"},{L"Favorites", L"%USERPROFILE%\\Favorites"},{L"History", L"%USERPROFILE%\\AppData\\Local\\Microsoft\\Windows\\History"},{L"Local AppData", L"%USERPROFILE%\\AppData\\Local"},{L"My Music", L"%USERPROFILE%\\Music"},{L"My Pictures", L"%USERPROFILE%\\Pictures"},{L"My Video", L"%USERPROFILE%\\Videos"},{L"NetHood", L"%USERPROFILE%\\AppData\\Roaming\\Microsoft\\Windows\\Network Shortcuts"},{L"Personal", L"%USERPROFILE%\\Documents"},{L"PrintHood", L"%USERPROFILE%\\AppData\\Roaming\\Microsoft\\Windows\\Printer Shortcuts"},{L"Programs", L"%USERPROFILE%\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs"},{L"Recent", L"%USERPROFILE%\\AppData\\Roaming\\Microsoft\\Windows\\Recent"},{L"SendTo", L"%USERPROFILE%\\AppData\\Roaming\\Microsoft\\Windows\\SendTo"},{L"Start Menu", L"%USERPROFILE%\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu"},{L"Startup", L"%USERPROFILE%\\AppData\\Roaming\\Microsoft\\Windows\\Start Menu\\Programs\\Startup"},{L"Templates", L"%USERPROFILE%\\AppData\\Roaming\\Microsoft\\Windows\\Templates"}};BOOL ret = FALSE;BOOL needKillExplorer = FALSE;HKEY hTestKey = NULL;DWORD cSubKeys = 0; // 子健个数DWORD cValues = 0; // 键值个数TCHAR achValue[MAX_VALUE_NAME]; // 键值名DWORD cchValue = MAX_VALUE_NAME; // 键值最大长度TCHAR achData[MAX_VALUE_DATA]; // 键数据DWORD cchData = MAX_VALUE_DATA; // 键数据最大长度DWORD cbName = 0;// 遍历 HKEY_CURRENT_USER/Software/Microsoft/Windows/CurrentVersion/Explorer/User Shell Folders if (ERROR_SUCCESS != RegOpenKeyEx(HKEY_CURRENT_USER,L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\User Shell Folders",0,KEY_ALL_ACCESS,&hTestKey)){LOG_INFO_A("RegOpenKeyEx failed. \n");goto end;}if (ERROR_SUCCESS != RegQueryInfoKey(hTestKey,NULL,NULL,NULL,&cSubKeys,NULL,NULL,&cValues,NULL,NULL,NULL,NULL)){LOG_INFO_A("RegQueryInfoKey failed. \n");goto end;}for (UINT i = 0; i < cValues; ++i){cchValue = MAX_VALUE_NAME;cchData = MAX_VALUE_DATA;achValue[0] = '\0';achValue[0] = '\0';if (ERROR_SUCCESS != RegEnumValue(hTestKey,i,achValue,&cchValue,NULL,NULL,(LPBYTE)achData,&cchData)){LOG_INFO_A("RegEnumValue failed. \n");continue; }// 如果有 \\ 开头的网络路径,就恢复if (achData[0] == '\\' && achData[1] == '\\'){if (mapShellFolders.find(achValue) == mapShellFolders.end()){continue;}if (ERROR_SUCCESS != RegSetValueEx(hTestKey,achValue,0,REG_EXPAND_SZ,(const BYTE*)mapShellFolders.find(achValue)->second.c_str(),MAX_VALUE_DATA)){LOG_INFO_A("[LYSM] RegSetValueEx failed. \n");continue;}needKillExplorer = TRUE;}}// 杀安全桌面 - explorer.exe 进程,使注册表改动生效 if (needKillExplorer){if (!killSecureExplorer()){goto end;}}ret = TRUE;
end:if (hTestKey){RegCloseKey(hTestKey);}return ret;
}
更多推荐
C/C++ 实现读写注册表
发布评论