Entwickler-Ecke

Dateizugriff - stringlist in exe speichern


Chrischuh - Di 20.01.09 15:47
Titel: stringlist in exe speichern
Hallo,

ist es möglich eine stringlist in einer exe zu speichern?

ich nutze folgene funktion um eine ressource zu laden:

Delphi-Quelltext
1:
ResourceStream:= TResourceStream.Create (hinstance, 'NAME', RT_RCDATA);                    

Geht das auch umgekehrt? Also den ResourceStream wieder in den Resourcen speichern.

Wahrscheinlich darf die Exe zur Laufzeit nich geändert werden, deswegen möchte ich das mit einer 2. Exe machen.

Oder ist das unnötig.


Narses - Di 20.01.09 16:55
Titel: Re: stringlist in exe speichern
Moin!

user profile iconChrischuh hat folgendes geschrieben Zum zitierten Posting springen:
ist es möglich eine stringlist in einer exe zu speichern?
Jain, du kannst aber die Stringliste mit SL.CommaText in einen String verwandeln, welchen du relativ problemlos in Ressourcenblock ablegen können solltest. :idea:

user profile iconChrischuh hat folgendes geschrieben Zum zitierten Posting springen:
Wahrscheinlich darf die Exe zur Laufzeit nich geändert werden, deswegen möchte ich das mit einer 2. Exe machen.
Löschen kann man eine aktive EXE nicht, aber umbenennen, deshalb würde es mich nicht wunden, wenn man auch den Inhalt ändern können sollte. :nixweiss:

Es gab hier mal ein Projekt (ich weiß leider nicht mehr von wem oder wie´s hieß), bei dem es darum ging, Ressourcen zu Lesen und zu Schreiben. Such doch mal ein bischen hier. ;)

cu
Narses


jaenicke - Di 20.01.09 17:05
Titel: Re: stringlist in exe speichern
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Löschen kann man eine aktive EXE nicht, aber umbenennen, deshalb würde es mich nicht wunden, wenn man auch den Inhalt ändern können sollte. :nixweiss:
Nicht direkt, man kann die laufende Exe aber umbenennen, kopieren und dann die neue starten.


jaenicke - Di 20.01.09 18:01

So, ich habe grade mal eine kleine Demo geschrieben, diese liegt im Anhang.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
  // Diese laufende Exe umbenennen
  RenameFile(ParamStr(0), ChangeFileExt(ParamStr(0), '.exe.bak'));
  // Und an die ursprüngliche Position kopieren
  CopyFile(PChar(ChangeFileExt(ParamStr(0), '.exe.bak')), PChar(ParamStr(0)), True);
  // Datei mit Originalnamen öffnen
  FileContents := TFileStream.Create(ParamStr(0), fmOpenReadWrite);
  // Jetzt dann verändern...
  ...

  FileContents.Free;
  // Geschriebene Exe ausführen und dafür sorgen, dass die umbenannte Exe
  // von ihr gelöscht wird.
  ShellExecute(Handle, 'open', PChar(ParamStr(0)), '/delbak',
    PChar(ExtractFileDir(ParamStr(0))), SW_SHOWNORMAL);
  // Programm schließen, sonst geht ja kein Löschen
  Close;
Und in FormCreate die zweite Datei löschen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
procedure TForm136.FormCreate(Sender: TObject);
begin
  {$B-} // vollständige boolsche Auswertung aus
  if (ParamCount > 0and (ParamStr(1) = '/delbak'then
    while FileExists(ChangeFileExt(ParamStr(0), '.exe.bak')) do
    begin
      DeleteFile(ChangeFileExt(ParamStr(0), '.exe.bak'));
      Sleep(1);
    end;
end;


In der Demo hänge ich jetzt Daten an die Exe an, das mache ich aber nur um zu zeigen, dass die Exe so verändert werden kann. Du kannst an der Stelle dann deine Ressource verändern. (Aber da weiß ich aus dem Kopf nicht wo ich da was verändern muss, deshalb hab ich das in der Demo nicht gemacht. ;-))


Narses - Di 20.01.09 18:46

Moin!

@user profile iconjaenicke: Irgendwie sehe ich das Thema jetzt schon mehrfach. :gruebel: Da lohnt doch schon fast ein FAQ-Eintrag, oh großer Tutorializer... :zustimm:

cu
Narses


jaenicke - Di 20.01.09 20:53

Aus der Überlegung heraus habe ich das auch geschrieben. ;-)
Aber ich bin mit dem letzten ja noch nicht fertig. Und und... :mrgreen:

Aber sonst hätte ich bei einem Beispiel nicht so darauf geachtet, dass es einigermaßen sauber geschrieben ist. :mrgreen:


Chrischuh - Di 20.01.09 21:31

super, genau was ich gesucht hatte. Danke


jaenicke - Mo 26.01.09 08:51

Ich habe soeben eine einfach zu benutzende Lösung als Beta veröffentlicht:
http://www.delphi-forum.de/viewtopic.php?p=545927
Im FAQ Beitrag werde ich diese genauer erklären, und ich bin dabei diese für Delphi 3-6 und Delphi 2009 anzupassen.
http://www.delphi-library.de/viewtopic.php?p=545198