Ich habe folgendes Problem:
Ich muss Windows-Registry Einträge die in einem ini-Artigen File (.axt von Novell) stehen in die Windows Registry schreiben. Ich parse zuerst das AXT-File in ein XML, um dann die Einträge schneller schreiben zu können möchte ich allerdings ein .reg File erstellen, und dieses per QProcess("regedit"...) eintragen lassen.
Momentan läuft das Erstellen des reg Files in einem Thread, in dem ich die Daten (Schlüssel und Werte) in ein QMultiHash einlesen. Als Schlüssel im MultiHash verwende ich die Registry-Schlüssel, da ich die Werte die in denselben Schlüssel gehören untereinander in das reg-File schreiben muss. Dazu sortiere ich den QMultiHash mit qSort (QtAlgorithms) nach dem Schlüssel. Hier tritt allerdings mein Problem auf. Manchmal tritt hierbei der Fehler: ASSERT failure in QHash: "Iterating beyond end()", file e:\system\qt\src\corelib\tools\qhash.cpp, line 180
auf. Dies allerdings nicht immer, manchmal funktioniert es 5-6 mal, bis dieser Fehler auftritt.
Dies ist der Codeteil bei dem der Fehler auftritt:
Code: Alles auswählen
appNode = appNode.firstChild();
QMultiHash< QString, RegistryKeyFactory::AbstractRegistryKey*> keys;
RegistryKeyFactory::AbstractRegistryKey* key;
QDomElement element;
while( !appNode.isNull())
{
element = appNode.toElement();
key = RegistryKeyFactory::createElement( element);
keys.insert( element.attribute("path"), key);
appNode = appNode.nextSibling();
}
qDebug() << keys.count();
qSort( keys.begin(), keys.end());
QMultiHash< QString, RegistryKeyFactory::AbstractRegistryKey*>::iterator i = keys.begin();
regStream << "Windows Registry Editor Version 5.000" << '\r' << '\n' << '\r' << '\n';
Code: Alles auswählen
<registry>
<string path="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\SequoiaView" value="SequoiaView" name="DisplayName" />
<string path="HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\SequoiaView" value="C:\Programme\SequoiaView\Uninstal.exe" name="UninstallString" />
<binary path="HKEY_LOCAL_MACHINE\SOFTWARE\Description\Microsoft\Rpc\UuidPersistentData" value="A0,92,DB,02,65,0D,D5,01" name="LastTimeAllocated" />
</registry>
Wie gesagt, der Fehler tritt nicht immer auf, manchmal beim ersten Versuch, manchmal beim dritten, oder sechten (oder dazwischen).
Muster konnte ich dahinter keines entdecken. Ich werde die Erstellung des reg's zwar noch in den Thread verschieben der das XML erstellt, damit ich das gleich auf einmal machen kann, dort kann ich es allerdings auch nicht anders machen, da die einzelnen Registry Einträge nicht nach Schlüssel sortiert eingetragen sind.
Sollte sich jemand den ganzen Source anschauen wollen:
SVN-Repo
Abei noch ein Beispiels AXT und die resultierenden XML und REG.
mfg
uhu01