Loading backends/regedit/regedit.cpp +12 −20 Original line number Diff line number Diff line Loading @@ -76,6 +76,10 @@ namespace confplus { return it == s.end(); } /** * @brief Rekursive Funktion zum Laden von Werten und Subkeys aus der Registry. * KORREKTUR: Verwendet std::unique_ptr und robustes ERROR_NO_MORE_ITEMS-Muster. */ void loadKeyRecursiveA(Config* conf, HKEY hKey, const std::string& currentConfigPath) { DWORD dwValues, dwSubKeys, dwMaxValueNameLen, dwMaxValueLen, dwMaxSubKeyLen; Loading @@ -93,7 +97,6 @@ namespace confplus { } // --- 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 @@ -102,7 +105,7 @@ namespace confplus { DWORD dwSizeValueName, dwSizeData, dwType; // ** ROBUSTE ITERATION ÜBER WERTE ** for (DWORD i = 0; ; ++i) { // Endlosschleife, wird durch ERROR_NO_MORE_ITEMS beendet for (DWORD i = 0; ; ++i) { dwType = 0; dwSizeValueName = maxNameSize; dwSizeData = maxDataSize; Loading @@ -120,15 +123,15 @@ namespace confplus { 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; // Pfad-Bildung: Standardwert (leerer Name) wird dem Sektions-Key zugewiesen std::string cname = currentConfigPath; if (!valueNameStr.empty()) { cname += "/" + valueNameStr; } 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 @@ -145,10 +148,6 @@ 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; } } Loading @@ -158,7 +157,7 @@ namespace confplus { HKEY hSubKey; // ** ROBUSTE ITERATION ÜBER SUBKEYS ** for (DWORD i = 0; ; ++i) { // Endlosschleife, wird durch ERROR_NO_MORE_ITEMS beendet for (DWORD i = 0; ; ++i) { DWORD dwSizeSubKeyName = maxSubKeySize; lRes = RegEnumKeyExA( Loading @@ -172,22 +171,15 @@ namespace confplus { } 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 +12 −20 Original line number Diff line number Diff line Loading @@ -76,6 +76,10 @@ namespace confplus { return it == s.end(); } /** * @brief Rekursive Funktion zum Laden von Werten und Subkeys aus der Registry. * KORREKTUR: Verwendet std::unique_ptr und robustes ERROR_NO_MORE_ITEMS-Muster. */ void loadKeyRecursiveA(Config* conf, HKEY hKey, const std::string& currentConfigPath) { DWORD dwValues, dwSubKeys, dwMaxValueNameLen, dwMaxValueLen, dwMaxSubKeyLen; Loading @@ -93,7 +97,6 @@ namespace confplus { } // --- 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 @@ -102,7 +105,7 @@ namespace confplus { DWORD dwSizeValueName, dwSizeData, dwType; // ** ROBUSTE ITERATION ÜBER WERTE ** for (DWORD i = 0; ; ++i) { // Endlosschleife, wird durch ERROR_NO_MORE_ITEMS beendet for (DWORD i = 0; ; ++i) { dwType = 0; dwSizeValueName = maxNameSize; dwSizeData = maxDataSize; Loading @@ -120,15 +123,15 @@ namespace confplus { 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; // Pfad-Bildung: Standardwert (leerer Name) wird dem Sektions-Key zugewiesen std::string cname = currentConfigPath; if (!valueNameStr.empty()) { cname += "/" + valueNameStr; } 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 @@ -145,10 +148,6 @@ 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; } } Loading @@ -158,7 +157,7 @@ namespace confplus { HKEY hSubKey; // ** ROBUSTE ITERATION ÜBER SUBKEYS ** for (DWORD i = 0; ; ++i) { // Endlosschleife, wird durch ERROR_NO_MORE_ITEMS beendet for (DWORD i = 0; ; ++i) { DWORD dwSizeSubKeyName = maxSubKeySize; lRes = RegEnumKeyExA( Loading @@ -172,22 +171,15 @@ namespace confplus { } 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