Dynamisch Daten in Programm selbst speichern



  • Kann man den Datenbereich, also z.B. Configurationseinstellungen in eine Exe mit reinpacken, damit man keine .cfg-Datei braucht? Wie würde man sowas anstellen?



  • Du könntest ein Feld definieren, so in etwa:

    char config [] = 
      "CONFIG_BEGIN___SEARCH___FOR___ME:\n"
      "CONFIG_A: \00123456789ABCDEF\n"
      "CONFIG_B: \00123456789ABCDEF\n";
    

    Dann über argv[0] "dich selbst" öffnen und das auslesen. Ist aber ein ziemliches Gefrickel, zumal du ja nicht mal weißt, ob du überhaupt Schreibrechte bekommst. Da könnte man natürlich auch wieder sich selbst doppelt umkopieren etc. pp. aber das lohnt alles überhaupt nicht, mach lieber eine .cfg/.ini/.whatever.



  • Eigentlich müsste ich einen Datenbereich doch beim Kompilieren angeben können, oder? Mir ist nur noch nicht klar, wie ich diesen Datenbereich dann aus dem Programm heraus lesen und wichtiger, beschreiben kann, da ich ja über das kompilierte Programm "drüberschreiben" müsste. Wäre es vielleicht möglich, aus dem Programm heraus festzustellen, wo die kompilierte Datei endet und das Dateiende einfach weiterzuschieben, dann hätte ich Platz für meine Werte gewonnen!



  • Die Daten statisch in das Programm einzubinden ist durchaus möglich, aber mir ist unklar, in welchem Sinn das dynamisch wäre.

    Eine Programmdatei, die sich selbst öffnet und Daten ausliest, ist dabei unnötig kompliziert. Wenn du ein

    char const *config = "...";
    

    im Code hast, kannst du das doch einfach benutzen.



  • seldon schrieb:

    im Code hast, kannst du das doch einfach benutzen.

    Dann wird es aber schwer, Daten über die Laufzeit des Programms hinweg festzuhalten und so wie ich es verstanden habe, möchte der TE das.

    @doctor-C
    Es gibt bestimmt noch ein paar andere Möglichkeiten das zu realisieren, aber keine mir bekannte würde ich ernsthaft in Erwägung ziehen. Was ist denn so schlimm an einer Konfigurationsdatei? Du kannst auch im Programm selbst Standardwerte definieren und die Konfigurationsdatei wenn noch nicht vorhanden, einfach neu anlegen.



  • Ach sorum. Jaaa...das ist schwieriger, und wahrscheinlich auch nicht besonders ratsam - es sollte mich nicht wundern, wenn heuristische Virenscanner derartige Dinge als verdächtig bewerteten.

    Für UNIX-artige Systeme gibt es in den GNU-binutils eine Bibliothek, mit der man das erschlagen können dürfte. Unter Windows hat man in das Problem, dass das Dateisystem dort die .exe lockt, solange das Programm läuft. Möglicherweise kommt man da weiter, indem man den Prozess daemonisiert oder so. Ich weiß es nicht.

    Wenn es nur darum geht, dass der unbedarfte Nutzer, wenn er im Explorer herumklickt, nicht auf die Idee kommen soll, selbst in den Konfigurationsdateien herumzuschreiben (also es um Sichtbarkeit geht): Reicht es nicht, den Kram am geeigneter Stelle (d.h. HKEY_CURRENT_USER\Software\Hersteller\Programm) in die Registry zu schreiben? Dafür ist sie ja da. Unter UNIX ist es in vergleichbarer Weise üblich, die Konfiguration in ein verstecktes Verzeichnis ~/.programmname zu schreiben.



  • seldon schrieb:

    Wenn es nur darum geht, dass der unbedarfte Nutzer, wenn er im Explorer herumklickt, nicht auf die Idee kommen soll, selbst in den Konfigurationsdateien herumzuschreiben (also es um Sichtbarkeit geht): Reicht es nicht, den Kram am geeigneter Stelle (d.h. HKEY_CURRENT_USER\Software\Hersteller\Programm) in die Registry zu schreiben? Dafür ist sie ja da. Unter UNIX ist es in vergleichbarer Weise üblich, die Konfiguration in ein verstecktes Verzeichnis ~/.programmname zu schreiben.

    Ja, das würde ich auch empfehlen. Wenn ein Nutzer die Konfiguration unbedingt ändern möchte, sollte er es IMHO auch dürfen. Du kannst nie alle Anwendungsfälle vorausplanen: Vielleicht möchte irgendwann mal jemand dein Programm in wine benutzen, und da funktioniert es nur, wenn man manuell in der Konfigurationsdatei eine Schriftart ändert oder was anderes, was ohne manuelles Editieren der Konfiguration nicht geht.



  • Wovon ich mal gehört hab ist folgendes:

    Eine .ini/.cnf anlegen und zwar im Verzeichniss wo dann später die .exe ist.
    Wenn die Werte welche in dieser config-datei enthalten sind verwendbar sind,
    sprich bestimmten maßstäben entsprechen sollen sie auch verwendbar sein.
    Sind sie jedoch nicht verwendbar, so soll aus einer default.ini/default.cnf
    in einem versteckten Verzeichnis gelesen werden und die .ini/.cnf im .exe
    Verzeichnis soll neu generiert werden (anhand der default.ini/default.cnf)

    Oder bin ich jetzt an einem Falschen Punkt?


Log in to reply