Seite 1 von 2

Kann man Werte in der Datasection auch schreibend verändern?

Verfasst: 24.11.2005 01:25
von Tracker
Ich habe noch ein Verständnisproblem zur Datasection.

Beispiel:

Code: Alles auswählen

Restore Platzhalter
Read Optionen$
MessageRequester("Testprogramm.exe",Optionen$,0)
DataSection
   Platzhalter:
   Data.s "Optionenbereich, der geändert werden soll"
   PlatzhalterEnde:
EndDataSection
Wenn ich ein Programm weitergebe und auf externe Ini-Dateien und Registry-Einträge verzichten will, gibt es die Möglichkeit mit PureBasic in der DataSection gespeicherte Daten nicht nur zu Lesen, sondern auch zu Schreiben?
Der Anwender soll z.B. Optionen, die er verändert im Programm speichern können.

Kennt jemand ein Codebeispiel, ob und wie das Schreiben in Verbindung mit DataSection-Befehlen funktioniert?

Verfasst: 24.11.2005 01:33
von xperience2003
generell zu datensektionen, du kannst den inhalt in variablen laden
und diese dann verändern
diese optionen wirst du dann erstmal extern speichern müssen
das das programm dann aus dem gespeicherten optionen ließt ,
wenn diese nicht vorhanden, dann die datazeilen auslesen

du hast ja die möglichkeiten eine ini oder textdatei irgentwo
im system anzulegen

andere sache der externen möglichkeiten wäre zb ein registry eintrag

wenn du garkeine daten speichern willst, aber der text dennoch anders sein
soll müsstest du die exe selbst verändern^^
selfmodifying executable...geht, müssteste mal im englischen furum suchen

Verfasst: 24.11.2005 01:59
von Tracker
Danke für den Hinweis!
Im englischen Forum könnte ich auch mal nachsehen.

Ich habe mich auf verschiedenen Webseiten schon umgesehen, aber in Verbindung mit DataSection immer nur lesende Beispiele gefunden.

Mich würde speziell zu DataSection interessieren, ob ein Überschreiben überhaupt vorgesehen bzw. möglich ist.

Beispiel:
Für einen Screensaver kann ich eine EXE-Datei (z.B. Screensaver.EXE) in eine SCR-Datei (z.B. Screensaver.SCR) umbenennen.

Die Screensaver.SCR kann unter Windows genauso gestartet werden, wie eine EXE-Datei.

Die Screensaver.SCR kopiere ich nach C:\Windows und binde sie unter "Systemsteuerung - Anzeige" als Bildschirmschoner ein.

Jetzt habe ich natürlich kein Interesse daran, dass mein Bildschirmschoner auf einem fremden Rechner irgendwelche INI-Dateien in C:\Windows ablegt oder die Registry verändert.
Ich will keinen Müll auf anderen Rechnern hinterlassen.

In diesem speziellen Beispiel wäre ich natürlich daran interessiert, dass evtl. Änderungen (z.B. die Bildschirmauflösung) in der Screensaver.SCR gespeichert werden.

Daher nochmal die Frage, gibt es reguläre Befehle in PureBasic, um Werte in der DataSection nicht nur zu lesen, sondern diese auch zu verändern?

Verfasst: 24.11.2005 07:08
von crossroads
Tracker hat geschrieben:Daher nochmal die Frage, gibt es reguläre Befehle in PureBasic, um Werte in der DataSection nicht nur zu lesen, sondern diese auch zu verändern?
Klare Frage, klare Antwort: Nein, reguläre PB-Befehle hierfür gibt es nicht.
Der Trick mit dem schon angesprochenen selfmodifying ist wohl die einzige Möglichkeit.

Verfasst: 24.11.2005 08:33
von Blackskyliner
Klar geht das macht es euch doch nicht so schwer....

Ihr lest die Datei komplettt in einen String oder so dort sucht ihr dann einen Platzhalter den ihr euch in die DataSection gesetzt habt und fügt dann danach die Daten ein, weil die DataSection steht im Klartext inner EXE drinne... Beispiel kann ich euch heut Nachmittag mal geben, falls gewünscht.

MFG Blackskyliner

Verfasst: 24.11.2005 12:29
von Froggerprogger
Ja Blackskyliner, das möchte ich sehen. Insbesondere mit dem String... und mit dem Überschreiben einer geöffnete Exe... :twisted:

Verfasst: 24.11.2005 14:32
von Tracker
@crossroads
Wenn PureBasic für DataSection keine Schreibmöglichkeiten bietet, OK, dann ist das eben so. Wollte ich nur mal bestätigt haben.
Dann werde ich die EXE-Datei für den Bildschirmschoner eben ohne Konfigurationsmöglichkeiten fertigmachen.

@Blackskyliner
Binäre EXE-Daten in einen String einlesen kann nur schiefgehen.
Die Strings sind durch Nullzeichen begrenzt und in EXE-Dateien gibt es jede Menge davon, so dass nur ein paar Bytes im String gespeichert werden.
Es gibt auch eine maximale Stringlänge, ich weiss nur im Augenblick nicht, wo bei PureBasic die Grenze liegt. Unbegrenzt lange Strings soll es, laut Interview mit Fred in den News der PureArec.net-Seite, erst in PureBasic 4.0 geben.
Man kann die EXE-Datei auch komplett in den Speicher einlesen und mit verschiedenen Tricks bearbeiten, aber das ist ein anderer Post und arbeitet nicht mit DataSection.
Trotzdem, wenn Du ein funktionierendes Codebeispiel hast, kannst Du das gerne posten. In PureBasic bin ich noch Anfänger und dankbar für alle Infos.

Verfasst: 24.11.2005 14:51
von Tracker
@Froggerprogger
Ich habe auch der PureArea.Net-Seite eine Funktion ReplaceFileData entdeckt, die du geschrieben hast und von Lars auf PureBasic 3.92+ upgedated wurde.
Wenn sie das leistet, was ich denke, könnte sie als Include-Datei eine gute alternative Lösung für mein Problem sein.

Leider weiß ich nicht richtig, wie ich die Parameter übergeben muss.
Ich habe in folgendem Forumseintrag die Frage gestellt, ob mir jemand ein Codebeispiel für den korrekten Aufruf der Funktion posten kann:

http://forums.purebasic.com/german/viewtopic.php?t=5737

Würdest Du mir dort ein Beispiel zum Aufruf dieser Funktion posten?

Verfasst: 24.11.2005 15:45
von PMV
Also, um Daten direkt selber in eine EXE zu schreiben sollteste vielleicht von Data Section weg gehen :D . Im prinzip ist eine EXE nichts weiter als eine Datei, die halt bei Doppelklick ausgeführt wird. Somt kann man diese EXE auch dann einfach öffnen ... aber das geht nicht, wenn sie läuft.

Ich kenn mich speziell mit Data Section nicht aus, aber es gibt andere wege, z.B. gibs im Code-Archiv folgendes:
http://www.purearea.net/pb/CodeArchiv/O ... difying.pb

Bis jetzt ist mir auch erlich gesagt keine andere Möglichkeit bekannt, Daten innerhalb einer EXE zu speichern, ohne die EXE dabei zu zerstören.

MFG PMV

Verfasst: 24.11.2005 18:48
von unix
Du kanst mit BinaryInclude eine datei Includieren und dann mit Read und WriteString belibig ändern.

Code: Alles auswählen

openfile(0,?MyFile) ;könnte wenn nicht
openfile(0,"MyFile")

readstring(...
writesting(...

datasection

MyFile:
 binaryinclude "MyFile"

enddatasection

oder so ähnlich.
Musste mal schaun