int RegGetStringValue(HKEY hk, LPCWSTR pszSubKey, LPCWSTR pszValueName, CEStr& rszData, DWORD Wow64Flags /*= 0*/) { int iLen = -1; HKEY hkChild = hk; DWORD cbSize = 0; LONG lrc; rszData.Empty(); if (pszSubKey && *pszSubKey) { if (hk == NULL) { lrc = RegGetStringValue(HKEY_CURRENT_USER, pszSubKey, pszValueName, rszData, 0); if (lrc < 0) { bool isWin64 = IsWindows64(); lrc = RegGetStringValue(HKEY_LOCAL_MACHINE, pszSubKey, pszValueName, rszData, isWin64 ? KEY_WOW64_64KEY : 0); if ((lrc < 0) && isWin64) { lrc = RegGetStringValue(HKEY_LOCAL_MACHINE, pszSubKey, pszValueName, rszData, KEY_WOW64_32KEY); } } if (lrc > 0) { return lrc; } } if (0 != (lrc = RegOpenKeyEx(hk, pszSubKey, 0, KEY_READ|Wow64Flags, &hkChild))) hkChild = NULL; } if (hkChild && (0 == (lrc = RegQueryValueEx(hkChild, pszValueName, NULL, NULL, NULL, &cbSize)))) { wchar_t* pszData = rszData.GetBuffer((cbSize>>1)+2); // +wchar_t+1byte (на возможные ошибки хранения данных в реестре) if (pszData) { pszData[cbSize>>1] = 0; // Make sure it will be 0-terminated if (0 == (lrc = RegQueryValueEx(hkChild, pszValueName, NULL, NULL, (LPBYTE)pszData, &cbSize))) { iLen = lstrlen(pszData); } else { rszData.Empty(); } } }
void LoadFilterSettings(std::vector<Filter>& filters, CRegKey& reg) { for (int i = 0; ; ++i) { CRegKey regFilter; if (regFilter.Open(reg, WStr(wstringbuilder() << L"Filter" << i)) != ERROR_SUCCESS) break; filters.push_back(Filter( Str(RegGetStringValue(regFilter)), IntToMatchType(RegGetDWORDValue(regFilter, L"MatchType", MatchType::Regex)), IntToFilterType(RegGetDWORDValue(regFilter, L"Type")), RegGetDWORDValue(regFilter, L"BgColor", Colors::BackGround), RegGetDWORDValue(regFilter, L"FgColor", Colors::Text), RegGetDWORDValue(regFilter, L"Enable", 1) != 0)); } }