Loading backends/regedit/regedit.cpp +84 −61 Original line number Diff line number Diff line Loading @@ -80,6 +80,7 @@ namespace confplus { DWORD dwValues, dwSubKeys, dwMaxValueNameLen, dwMaxValueLen, dwMaxSubKeyLen; // 1. Hole Infos über den aktuellen Schlüssel LONG lRes = RegQueryInfoKeyA( hKey, NULL, NULL, NULL, &dwSubKeys, &dwMaxSubKeyLen, NULL, Loading @@ -91,7 +92,8 @@ namespace confplus { return; } if (dwValues > 0) { // --- 2. Werte (Values) laden --- // maxNameSize und maxDataSize müssen die Nullterminierung mit einbeziehen DWORD maxNameSize = dwMaxValueNameLen > 0 ? dwMaxValueNameLen + 1 : 1; DWORD maxDataSize = dwMaxValueLen > 0 ? dwMaxValueLen + 1 : 1; Loading @@ -99,7 +101,8 @@ namespace confplus { std::unique_ptr<char[]> dataBuffer(new char[maxDataSize]); DWORD dwSizeValueName, dwSizeData, dwType; for (DWORD i = 0; i < dwValues; ++i) { // ** ROBUSTE ITERATION ÜBER WERTE ** for (DWORD i = 0; ; ++i) { // Endlosschleife, wird durch ERROR_NO_MORE_ITEMS beendet dwType = 0; dwSizeValueName = maxNameSize; dwSizeData = maxDataSize; Loading @@ -111,8 +114,13 @@ namespace confplus { (LPBYTE)dataBuffer.get(), &dwSizeData ); if (lRes == ERROR_NO_MORE_ITEMS) { break; // Korrekte Terminierung } if (lRes == ERROR_SUCCESS) { std::string valueNameStr = std::string(valueNameBuffer.get()); // Überspringe den '(Standardwert)', wenn benannte Werte vorhanden sind if (valueNameStr.empty() && dwValues > 1) { continue; } Loading @@ -120,6 +128,7 @@ namespace confplus { std::string cname = currentConfigPath + (valueNameStr.empty() ? "" : "/" + valueNameStr); std::string cvalue; // Konvertierungslogik wie zuvor (REG_SZ, REG_DWORD) if (dwType == REG_SZ) { cvalue = std::string(dataBuffer.get()); } else if (dwType == REG_DWORD) { Loading @@ -136,16 +145,20 @@ namespace confplus { Config::ConfigData* ckey = conf->setKey(cname); conf->setValue(ckey, 0, cvalue); } } else { // Bei einem anderen Fehler (z.B. Puffer zu klein) wird i trotzdem inkrementiert und die Schleife fortgesetzt. std::cerr << "Warning: RegEnumValueA failed (Index " << i << "): Error " << lRes << std::endl; } } if (dwSubKeys > 0) { // --- 3. Subkeys (Unterschlüssel) rekursiv laden --- DWORD maxSubKeySize = dwMaxSubKeyLen > 0 ? dwMaxSubKeyLen + 1 : 1; std::unique_ptr<char[]> subKeyNameBuffer(new char[maxSubKeySize]); HKEY hSubKey; for (DWORD i = 0; i < dwSubKeys; ++i) { // ** ROBUSTE ITERATION ÜBER SUBKEYS ** for (DWORD i = 0; ; ++i) { // Endlosschleife, wird durch ERROR_NO_MORE_ITEMS beendet DWORD dwSizeSubKeyName = maxSubKeySize; lRes = RegEnumKeyExA( Loading @@ -154,17 +167,27 @@ namespace confplus { NULL, NULL, NULL, NULL ); if (lRes == ERROR_NO_MORE_ITEMS) { break; // Korrekte Terminierung } if (lRes == ERROR_SUCCESS) { // Öffne den Subkey lRes = RegOpenKeyExA( hKey, subKeyNameBuffer.get(), 0, KEY_READ, &hSubKey ); if (lRes == ERROR_SUCCESS) { // Erzeuge den neuen Konfigurationspfad std::string nextConfigPath = currentConfigPath + "/" + std::string(subKeyNameBuffer.get()); // Rekursiver Aufruf loadKeyRecursiveA(conf, hSubKey, nextConfigPath); RegCloseKey(hSubKey); } } } else { std::cerr << "Warning: RegEnumKeyExA failed (Index " << i << "): Error " << lRes << std::endl; } } } Loading Loading
backends/regedit/regedit.cpp +84 −61 Original line number Diff line number Diff line Loading @@ -80,6 +80,7 @@ namespace confplus { DWORD dwValues, dwSubKeys, dwMaxValueNameLen, dwMaxValueLen, dwMaxSubKeyLen; // 1. Hole Infos über den aktuellen Schlüssel LONG lRes = RegQueryInfoKeyA( hKey, NULL, NULL, NULL, &dwSubKeys, &dwMaxSubKeyLen, NULL, Loading @@ -91,7 +92,8 @@ namespace confplus { return; } if (dwValues > 0) { // --- 2. Werte (Values) laden --- // maxNameSize und maxDataSize müssen die Nullterminierung mit einbeziehen DWORD maxNameSize = dwMaxValueNameLen > 0 ? dwMaxValueNameLen + 1 : 1; DWORD maxDataSize = dwMaxValueLen > 0 ? dwMaxValueLen + 1 : 1; Loading @@ -99,7 +101,8 @@ namespace confplus { std::unique_ptr<char[]> dataBuffer(new char[maxDataSize]); DWORD dwSizeValueName, dwSizeData, dwType; for (DWORD i = 0; i < dwValues; ++i) { // ** ROBUSTE ITERATION ÜBER WERTE ** for (DWORD i = 0; ; ++i) { // Endlosschleife, wird durch ERROR_NO_MORE_ITEMS beendet dwType = 0; dwSizeValueName = maxNameSize; dwSizeData = maxDataSize; Loading @@ -111,8 +114,13 @@ namespace confplus { (LPBYTE)dataBuffer.get(), &dwSizeData ); if (lRes == ERROR_NO_MORE_ITEMS) { break; // Korrekte Terminierung } if (lRes == ERROR_SUCCESS) { std::string valueNameStr = std::string(valueNameBuffer.get()); // Überspringe den '(Standardwert)', wenn benannte Werte vorhanden sind if (valueNameStr.empty() && dwValues > 1) { continue; } Loading @@ -120,6 +128,7 @@ namespace confplus { std::string cname = currentConfigPath + (valueNameStr.empty() ? "" : "/" + valueNameStr); std::string cvalue; // Konvertierungslogik wie zuvor (REG_SZ, REG_DWORD) if (dwType == REG_SZ) { cvalue = std::string(dataBuffer.get()); } else if (dwType == REG_DWORD) { Loading @@ -136,16 +145,20 @@ namespace confplus { Config::ConfigData* ckey = conf->setKey(cname); conf->setValue(ckey, 0, cvalue); } } else { // Bei einem anderen Fehler (z.B. Puffer zu klein) wird i trotzdem inkrementiert und die Schleife fortgesetzt. std::cerr << "Warning: RegEnumValueA failed (Index " << i << "): Error " << lRes << std::endl; } } if (dwSubKeys > 0) { // --- 3. Subkeys (Unterschlüssel) rekursiv laden --- DWORD maxSubKeySize = dwMaxSubKeyLen > 0 ? dwMaxSubKeyLen + 1 : 1; std::unique_ptr<char[]> subKeyNameBuffer(new char[maxSubKeySize]); HKEY hSubKey; for (DWORD i = 0; i < dwSubKeys; ++i) { // ** ROBUSTE ITERATION ÜBER SUBKEYS ** for (DWORD i = 0; ; ++i) { // Endlosschleife, wird durch ERROR_NO_MORE_ITEMS beendet DWORD dwSizeSubKeyName = maxSubKeySize; lRes = RegEnumKeyExA( Loading @@ -154,17 +167,27 @@ namespace confplus { NULL, NULL, NULL, NULL ); if (lRes == ERROR_NO_MORE_ITEMS) { break; // Korrekte Terminierung } if (lRes == ERROR_SUCCESS) { // Öffne den Subkey lRes = RegOpenKeyExA( hKey, subKeyNameBuffer.get(), 0, KEY_READ, &hSubKey ); if (lRes == ERROR_SUCCESS) { // Erzeuge den neuen Konfigurationspfad std::string nextConfigPath = currentConfigPath + "/" + std::string(subKeyNameBuffer.get()); // Rekursiver Aufruf loadKeyRecursiveA(conf, hSubKey, nextConfigPath); RegCloseKey(hSubKey); } } } else { std::cerr << "Warning: RegEnumKeyExA failed (Index " << i << "): Error " << lRes << std::endl; } } } Loading