plattformübergreifende registry-API



  • Hallo,
    ich möchte in meinem Projekt eine Funktion einbauen, die Werte aus der Windows-registry auslesen kann und diese als QVariant zurückliefert.
    Unter Windows ansich anscheinend kein Problem, da Qt das per QSettings unterstützt, allerdings will ich dabei auch Unix-Plattformen berücksichtigen, sprich am besten wine.
    Hat jemand eine Idee, wie ich das am besten löse? Wenn es nicht mit QSettings geht würde ich idealerweise eine Funktion von wine selbst verwenden, da die das Format mit großer Wahrscheinlichkeit am besten beherrscht, allerdings kenne ich mich erstens nicht wirklich aus und zweitens weiß ich nicht genau, ob dann eine riesige wine-Bibliothek mitgeladen werden muss.


  • Mod

    Unix-Plattformen haben keine registry. wine hat eine registry, aber du musst nichts spezielles machen, damit dein Programm mit wine läuft. Eher im Gegenteil: Je "normaler" dein Programm ist, desto eher funktioniert das. Und du musst auch nichts mit wine-Bibliotheken machen. Das ist eher so eine Art Laufzeitumgebung. Und man kann dann auch nicht wirklich von plattformübergreifend reden. wine zu benutzen ist (trotz des Namens) wie ein Emulator.



  • Schreib lieber native Programme die ordentlich laufen.



  • Entschuldigung, aber was sind das denn für Antworten?
    Ich meinte doch, dass es auf Unix-Plattformen mit wine laufen soll und ich WEISS was wine ist. Es geht konkreter darum, die registry-Einträge eines Computerspiels auszulesen. Meine Anwendung ist plattformübergreifend und Open Source, aber das Spiel eben nicht und funktioniert daher unter Unix-Systemen nur mit wine! Von daher will ich es eben so unterstützen.



  • Und wo ist dann das Problem? Winapi nutzen und gut ist. Die Registry an sich ist schon (wie bereits gesagt) nicht plattformübergreifend.


  • Administrator

    SG1 schrieb:

    Und wo ist dann das Problem? Winapi nutzen und gut ist. Die Registry an sich ist schon (wie bereits gesagt) nicht plattformübergreifend.

    Ich glaube fast, dass er meint, er wolle von aussen auf Wine zugreifen und die Registry auslesen. Allerdings wäre dies extrem unglücklich ausgedrückt 🙂

    Grüssli



  • Genau das meine ich.
    Im Grunde genommen muss ich ja nur die Datei "~/.wine/user.reg" parsen und die Werte der Keys auslesen können, jedoch bin ich mir eben nicht sicher, ob das Format der Datei in wine immer dasselbe bleibt und hätte jetzt am ehesten die wine-API genutzt. Ich hatte auch darauf gehofft, eventuell Lösungen mit der Klasse QSettings zu bekommen, bei der man die einzulesende Datei und ihr Format selbst bestimmen kann, sodass ich eben die wine-registry-Datei übergeben könnte.
    Von Hand parsen halte ich für die unsauberste Lösung.
    Das Problem bei der wine-Lösung ist halt, dass ich mein Programm mit irgendeiner wine-Bibliothek linken muss und mein Programm auch funktionieren soll, wenn wine nicht installiert ist und die registry-Einträge gar nicht existieren!
    Das Einlesen ist ein optionales Feature. Falls das entsprechende Spiel installiert ist (ob auf Windows oder per wine), bestimme ich so den Installationspfad des Spiels und greife auf dessen Daten zu.
    Hoffe das ist jetzt etwas verständlicher, alles andere macht nämlich wenig Sinn 😃


  • Mod

    Um das nochmal zusammenzufassen: Dein Programm liest Registryeinträge eines bestimmten Spiels aus. Dieses Spiel läuft zwangsläufig nur auf Plattformen, die eine Registry haben. Nun möchtest du mit allen Mitteln erreichen, dass dein Programm auch auf Plattformen ohne Registry funktioniert.

    😕

    Warum?


  • Administrator

    Hmmm ... hast du schon mal auf den Seiten zu Wine gesucht?
    Ich kenne mich mit Wine extrem schlecht aus, aber kannst du nicht mit Wine und reg.exe per Kommandozeile ein Query absetzen und das Resultat dann einlesen? Irgendwas in diese Richtung:

    wine reg query dein\key
    

    Ich zweifle stark, dass dir da QSettings irgendwie weiterhilft.

    Aber ich habe sowieso keine Ahnung, von daher bin ich mal still 🙂

    Grüssli


  • Administrator

    SeppJ schrieb:

    Um das nochmal zusammenzufassen: Dein Programm liest Registryeinträge eines bestimmten Spiels aus. Dieses Spiel läuft zwangsläufig nur auf Plattformen, die eine Registry haben. Nun möchtest du mit allen Mitteln erreichen, dass dein Programm auch auf Plattformen ohne Registry funktioniert.

    😕

    Warum?

    So wie ich ihn verstanden habe, kann sein Programm noch mehr und das mit dem Spiel ist nur ein Zusatz. Aber seine Formulierungen waren bisher dürftig, kann daher auch falsch liegen. 😉

    Grüssli



  • Dravere schrieb:

    SeppJ schrieb:

    Um das nochmal zusammenzufassen: Dein Programm liest Registryeinträge eines bestimmten Spiels aus. Dieses Spiel läuft zwangsläufig nur auf Plattformen, die eine Registry haben. Nun möchtest du mit allen Mitteln erreichen, dass dein Programm auch auf Plattformen ohne Registry funktioniert.

    😕

    Warum?

    So wie ich ihn verstanden habe, kann sein Programm noch mehr und das mit dem Spiel ist nur ein Zusatz. Aber seine Formulierungen waren bisher dürftig, kann daher auch falsch liegen. 😉

    Grüssli

    Mein Programm ist ein Map-Editor für ein Computerspiel. Hier gibt es einen Thread zum Projekt. Das Spiel besitzt Einträge in der registry (wie die meisten Windowsanwendungen), z. B. den Installationspfad. Mein Map-Editor funktioniert auch ohne das Spiel, aber macht natürlich am meisten Sinn, wenn man darin auch die Daten des Spiels (Texturen, Modelle usw) verwenden kann.
    Damit das funktioniert prüft mein Programm, ob die registry-Einträge vorhanden sind und liest sie anschließend aus, um das Installationsverzeichnis des Spiels herauszufinden, um dann in diesem die Daten des Spiels einzulesen, damit man diese im Map-Editor verwenden kann.
    Es geht hier jetzt nur um die beste Lösung!

    Die Lösung mit dem wine-Befehl ist schon mal ein Anfang, danke. Allerdings muss dafür eben wine gestartet werden und das wollte ich nach Möglichkeit irgendwie vermeiden, weil das nach meiner Erfahrung lange dauern kann bzw. für die kleine Abfrage meiner Meinung nach zu rechenintensiv wäre.
    Dass ich mit QSettings nicht weiterkomme habe ich eben befürchtet, weil es kaum einen ähnlichen Anwendungszweck wie den hier beschriebenen gibt.



  • Barade schrieb:

    Es geht hier jetzt nur um die beste Lösung!

    Den Nutzer den Pfad eingeben lassen, das funktioniert garantiert und ohne Gefrickel.



  • winelib?


  • Administrator

    Ehm, eine Frage:
    Wieso muss dein Map-Editor auch auf anderen Plattformen lauffähig sein? Wieso kann derjenige den Map-Editor nicht auch mit Wine starten? Würde alle deine Probleme lösen.
    Mit diesem zusätzlichen Feature, dass wohl kaum von jemanden benutzt werden wird, schaffst du dir nur unnötige Probleme.

    Ansonsten siehe die Antwort von cooky451 🙂

    Grüssli



  • Na ja, wenn ich meine Anwendung nur für Windows entwickle, so dass man sie mit wine starten muss, hat man schon ziemliche Nachteile. Abgesehen davon, dass wine noch relativ viele Fehler hat (in den anderen Bereichen, die die Anwendung abdeckt), ist es auch deutlich langsamer, würde ich mal behaupten.

    Natürlich kann man auch zusätzliche Quellen manuell angeben, aber wenn schon einmal die Möglichkeit besteht, es automatisiert zu machen, wieso dann nicht nach einer solchen Lösung suchen?

    Das Problem bei der Verwendung der winelib ist, wie gesagt, dass sie beim Linken vorhanden sein muss. Um es so einfach wie möglich zu machen (ohne zwingende Abhängigkeiten), finde ich die Lösung mit dem Befehl "wine reg query" fast noch am besten. Inzwischen habe ich das hier gefunden. Ich würde jetzt alternativ auch z. B. einfach advapi32.dll.so bzw. advapi64.dll.so per dlopen erst zur Laufzeit laden. Dann kann man mein Programm ohne wine installiert zu haben kompilieren und trotzdem wine ggf. verwenden. Klingt vermutlich für Windows-User etwas merkwürdig, aber ich komme von einer Distribution, bei der die Programme noch auf dem eigenen System kompiliert werden 😉


Anmelden zum Antworten