Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Daten in EXE speichern (https://www.delphipraxis.net/55915-daten-exe-speichern.html)

Chrissi91 28. Okt 2005 16:44


Daten in EXE speichern
 
Hallo,

ich bin zwar mit der Hilfe sehr schnell fündig geworden, jedoch ergab sich keine komplette Antwort auf diese Frage:

Ich möchte gerne, wie es die Überschrift schon sagt, in eine EXE Datei eine Zeile anfügen, die nur einen Pfad (also string) beinhaltet. Ich habe schon herausgefunden, dass ich das mit Blockread und Blockwirte anstellen soll, aber wie? Zwar habe ich mit Blockread und Blockwrite schon ein wenig Erfahrungen gesammelt ;), abr dazu reicht es wohl nicht aus.

Ich weiß nicht, ob beim Starten die EXE den Pfad ignoriert in der letzten Zeile oder eine Fehlermeldung ausgibt. Muss ich das vorher rausfiltern? Also wie kann ich eine Zeile speichern, löschen und einlesen? Um Codes wäre ich sehr dankbar ;)

Falls das Ganze in der falschen Spalte gelandet sein sollte, bitte ich dies zu entschuldigen.

MfG

Chrissi91

//edit: Das Angefügte soll nicht verschlüsselt werden ;)

MrKnogge 28. Okt 2005 17:03

Re: Daten in EXE speichern
 
Such hier mal nach Hier im Forum suchenResourceupdate.

gruss

ichbins 28. Okt 2005 17:22

Re: Daten in EXE speichern
 
um was ganz hinten an die Datei anzuhängen, musst du sie erst kompilieren. Dann kannst du mit einem anderen Delphiprogramm oder einem geeigneten Editor Daten dazuschreiben. Das würd ich so machen:

Delphi-Quellcode:
  EXE-DATEI, NICHT VERÄNDERN (Notepad macht das automatisch, da es bestimmte Zeichen nicht speichern kann)
  < anzuhängende Daten >
  größe der EXE-DATEI: longint
dann kann sich die EXE so auslesen:

Delphi-Quellcode:
var
  f:file of byte;
  l:longint;
begin
  filemode:=0;
  assignfile(f,application.exename);
  reset(f);
  seek(f,sizeof(f)-4);
  blockread(f,l,4);
  seek(f,l);
  /////Hier kannst du jetzt mit read oder blockread die Daten auslesen.
  closefile(f);
end;
wenn du aber nur einen String speichern willst, würde doch auch eine globale Konstante reichen?

Delphi-Quellcode:
  const pfad:string='C:\qwertzuiop\asdfghjklöä\'´;

Chrissi91 28. Okt 2005 17:34

Re: Daten in EXE speichern
 
Ich glaube du verstehst mich miss ...

Das Programm soll einen immer wieder benutzten Pfad speichern, soll also benutzerfreundlich sein ;)

und das soll einfach nur an die exe ;)

http://www.dsdt.info/tipps/?id=645

Das verstehe ich da nicht:

Delphi-Quellcode:
const ExeSize=205312;
Das soll ja eine Variable sein, aber warum das =205312?

quirks 28. Okt 2005 17:53

Re: Daten in EXE speichern
 
da gabs mal was, ich weiß nur nicht mehr, wo der code ist. eine exe-datei hat nämlich einen header, in dem die effektive größe der _ausführbaren_ datei drinne steht. was dahinter ist, ignoriert windows beim ausführen einfach. den header muss man also auslesen, und kann dann fröhlich alles hintendran auslesen/schreiben.

ichbins 28. Okt 2005 18:20

Re: Daten in EXE speichern
 
wie ich oben geschrieben hab. du schreibst die größe des ausführbaren codes einfach hinten hin, das kannst du immer auslesen (seek(filesize(f)-4))

Die EXE kann zur Laufzeit nicht geschrieben werden. Das müsstest du über eine DLL machen, die zur Laufzeit der EXE geladen wird, dann wartet bis die EXE zu ist, und dann in die EXE schreibt. (viel zu kompliziert. mach ne tinifile (unit inifiles) oder die registry

Chrissi91 28. Okt 2005 18:46

Re: Daten in EXE speichern
 
Mit registry meinst du sicherlich die Registrierungsdatenbank ... Wie geht das? ;)

ichbins 28. Okt 2005 18:49

Re: Daten in EXE speichern
 
probier mal tregistry in der Unit registry.
Zitat:

Zitat von Borland Delphi Hilfe
Das folgende Beispiel liest den Wert eines Registrierungseintrags:
Delphi-Quellcode:
function GetRegistryValue(KeyName: string): string;
var
    Registry: TRegistry;
begin
  Registry := TRegistry.Create(KEY_READ);
  try
        Registry.RootKey = HKEY_LOCAL_MACHINE;
    // false, weil kein Eintrag erzeugt werden soll, sofern er nicht vorhanden ist.
        Registry.OpenKey(KeyName, False);
        Result := Registry.ReadString('VALUE1');
  finally
        Registry.Free;
   end;
 end;

das kannst du ja nach deinen eigenen Bedürfnissen umformen.
Delphi-Quellcode:
procedure savedirname(dirname:string);
var
  r:tregistry;
begin
  r:=tregistry.create(HKEY_CURRENT_USER);
  r.openkey('Software\hersteller\progname\',true);
  r.writestring('dirname',dirname);
  r.free;
end;

function getdirname:string;
var
  r:tregistry;
begin
  r:=tregistry.create(HKEY_CURRENT_USER);
  r.openkey('Software\hersteller\progname\',true);
  result:=r.readstring('dirname');
  r.free;
end;
(jetzt gerade getestet, write geht noch nicht :?)

sorry für das von vorhin, treginifile is was anderes (was genau :?: :roll: :| )

Chrissi91 28. Okt 2005 19:04

Re: Daten in EXE speichern
 
Sorry, aber mit der Regiertrierungsdatenabnk hatte ich bis jetzt noch nie etwas gemacht ... Das Beispiel (danke dafür ;)) ist zwar sehr schön, aber könntest du einfach mal inein Verzeichnis 'test' oder sowas schreiben?
Und nochwas ... Ist das nun lesen oder schreiben? Ich bräuchte natürlich beides ...

aso jetzt is es ja da ;)

edit:

Delphi-Quellcode:
function getdirname:string;
var
  r:tregistry;
begin
  r:=tregistry.create(HKEY_CURRENT_USER);
  r.openkey('Software\hersteller\progname\',true);
  result:=r.readstring('dirname');
  r.free;
end;
den sinn verstehe ich net :?: steht doch darüber, oder? 2mal das gleiche ?

Delphi-Quellcode:
result:=r.readstring('dirname');
das liest es ja ein, aber was ist 'dirname'? name des schlüssels oder wie?

Luckie 28. Okt 2005 19:08

Re: Daten in EXE speichern
 
Zitat:

Zitat von Chrissi91
aber könntest du einfach mal inein Verzeichnis 'test' oder sowas schreiben?
Und nochwas ... Ist das nun lesen oder schreiben? Ich bräuchte natürlich beides ...

Also so schwer sind diese zweimal vier zeilen nun auch icht zu verstehen. Was wird wohl ReadStringmachen? lesen oder schreiben? Was wird wohl WriteString machen? lesen oder schreiben? Und wenn man es nicht weiß, dann guckt man es einfach mal in der Hilfe nach. Etwas mitdenken und mitarbeiten wäre nicht schlecht.

@ichbins: Es fehlen jegliche Ressourcenschützblöcke und Openkey leifert einen Rückgabewert zurück, den man nicht ignorieren sollte.

Chrissi91 28. Okt 2005 19:10

Re: Daten in EXE speichern
 
Ja ... aber da war ja auch nur eines der beiden da ... und zwar anders geschrieben ;)

ichbins 28. Okt 2005 19:11

Re: Daten in EXE speichern
 
'dirname' is der Name des Eintrags im schlüssel. Mal kommentiert:

Delphi-Quellcode:
function getdirname:string;
var
  r:tregistry;
begin
  r:=tregistry.create(HKEY_CURRENT_USER);             //Registry-Variable wird erstellt und auf HKEY_CURRENT_USER (Datenbank des aktuellen Users (ohne Admin-Rechte schreibbar) eingestellt
  r.openkey('Software\hersteller\progname\',true);   //Der Key HKEY_CURRENT_USER\Software\Hersteller\Programme\ wird geöffnet. Falls er nicht existiert, wird er erstellt (durch das true)
  result:=r.readstring('dirname');                   //Der Inhalt des Eintrags 'Dirname' im Key HKEY_CURRENT_USER\Software\Hersteller\Programme\ wird eingelesen
  r.free;
end;

@luckie: Ich denke mal einfach, der User hat ein Recht, in seine eigene (HKEY_CURRENT_USER) Registrierungsdatenbank zu schreiben und auch der Ram ist nicht voll oder so. Was sind resourcenschutzblöcke :?: :duck:

Luckie 28. Okt 2005 19:24

Re: Daten in EXE speichern
 
Zitat:

Zitat von ichbins
@luckie: Ich denke mal einfach, der User hat ein Recht, in seine eigene (HKEY_CURRENT_USER) Registrierungsdatenbank zu schreiben

Sollte er, aber man darf beim Programmieren nichts für sicher annehmen.

Zitat:

Was sind resourcenschutzblöcke :?: :duck:
Delphi-Quellcode:
try

finally

end;
So wie es in dem Code steht, den du zitiert hast.

ichbins 28. Okt 2005 19:35

Re: Daten in EXE speichern
 
es sollte ja nur ein unoptimierter kleiner Beispielscode sein.

Luckie 28. Okt 2005 19:43

Re: Daten in EXE speichern
 
Und woher soll ein Anfänger wissen, wie es richtig aussieht? ;)

ichbins 28. Okt 2005 20:00

Re: Daten in EXE speichern
 
ich glaubs ja... :) aaaaaaber wenn du mal nach dem Beispiel in der Delphi-OH schaust, siehst du, dass es die borlander auch nicht besser machen:
Wenn du den Code rauskopierst, lässt er sich erst mal gar nicht compilieren, da die Variablennamen unterschiedlich aus dem englischen übersetzt wurden. Dann sind da so komische zeichen drin (#17, usw), bei denen der Compiler eine Fehlermeldung bringt und letztendlich wird das openkey-result auch nicht abgefragt.

--> Hilfe von D7 Pers, andere weiss ich nicht.

(eigentlich ja eine OT-Diskussion...)

Luckie 29. Okt 2005 02:27

Re: Daten in EXE speichern
 
Der Übersetzungsfehler ist ein Fehler des Übersetzers und nicht von Borland.
Die Zeichen stam,men wohl aus dem Hilfeformat, aquch nicht Borlands schuld.
Und auch die Borländer sind keine fehlerlosen Götter.

Chrissi91 29. Okt 2005 09:43

Re: Daten in EXE speichern
 
Also, da das mit den Daten in der EXE speichern nicht so einfach ist, lass ich es ;)

Langsam wirds OT ;)

FriFra 29. Okt 2005 09:53

Re: Daten in EXE speichern
 
Such mal nach dem ExtraResManager ;) damit kannst Du sehr leicht Daten an exe'n anhängen. Um Daten an die eigene exe zu hängen gehst Du dann wie folgt vor:
1. Kopie der eigenen exe in Tempordner
2. Extraresourcen anhängen
3. Batch schreiben, welche die eigene Datei löscht und anschließend die Kopie aus dem Temmpordner über die aktuelle Version kopiert und dann das Programm startet
4. Batch "hidden" ausführen
5. Programm beenden

Die Lösung für 3. findest Du bei den Schweizern...

ichbins 29. Okt 2005 10:18

Re: Daten in EXE speichern
 
vielleicht wär die Registry dannn doch noch einfacher. Am leichtesten geht es ja mit ner Inifile:

Delphi-Quellcode:
uses inifiles;
[...]
procedure savedirname(dirname:string);
var
  i:tinifile;
begin
  try begin
  i:=tinifile.create(changefileext(application.exename,'.ini'));
  //Ini-Datei erstellen
  i.writestring('Dirs','Path',dirname);
  //Eintrag in Datei speichern
  i.Free;
  //Datei schließen
  filesetattr(changefileext(application.exename,'.ini'),fasysfile and fahidden)
  //Datei verstecken
  end; except end;
end;

function getdirname:string;
var
  i:tinifile;
begin
  result:=extractfilepath(application.exename)
  //zuerst alternatives Ergebniss setzten (pfad der EXE-Datei)
  try begin
    i:=tinifile.create(changefileext(application.exename,'.ini'));
    //Dann Inifile erstellen. Die Inifile erhält den Namen der EXE-Datei nur mit der Endung .ini statt .exe
    result:=i.ReadString('Standard','Dirname',extractfilepath(application.ExeName));
    //Aus der Sektion STANDART der Inidatei wird der Wert von dirname eingelesen.
  end; finally
    i.free;
    //Die Inidatei wird geschlossen
  end;
end;
(ungetestet)

Ich weiss auch gar nicht, wieso es dir so wichtig ist, unbedingt die Daten in der eigenen Exe abzuspeichern? Das ist die komplizierteste mögliche Lösung...

Ne INI-Datei tuts ja auch...

Außerdem kannst du die INI-Datei auch verstecken usw so dass der User sie nicht sehen kann.

Die beiden Prozeduren kopierst du dann irgendwo ziemlich oben in deine Unit rein (am besten gleich nach IMPLEMENTATION). Dann kannst du sie so aufrufen:

Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  pathname:=getdirname;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  savedirname(pathname);
end;
wobei pathname eine globale string-variable ist, auf die du in allen anderen Prozeduren zugreifen kannst.

Chrissi91 29. Okt 2005 16:41

Re: Daten in EXE speichern
 
Wunderbar, aber einige Anmerkungen in Fragen:

1. Ich brauche eine Lösung, wo ich keine neue Komponente für brauche, da mein Delphi 7 PE keine mehr aufnimmt :(
2. Mit der Unit Tregistry: Kann ich den Code nicht kopieren? Oder ist wieder irgendwas dazu nötig? Er kennt nämlich nicht ohne weiteres Tregistry? Muss ich eine Unit einbinden, wenn ja, wie? ;)
3. Registrierungsdatenbank wäre mir am Liebsten ... :)

ichbins 29. Okt 2005 17:15

Re: Daten in EXE speichern
 
du musst die Unit registry einbinden. Für Tinifile musst du die Unit inifiles einbinden. Eine Komponente brauchst du für keine der Lösungen.

Chrissi91 29. Okt 2005 17:46

Re: Daten in EXE speichern
 
aha, aber bitte mal kurz erläutern, wie ... :mrgreen:

ichbins 29. Okt 2005 17:46

Re: Daten in EXE speichern
 
äh, was genau :gruebel:

Chrissi91 29. Okt 2005 17:48

Re: Daten in EXE speichern
 
was wohl? ;)

Zitat:

Zitat von ichbins
du musst die Unit registry einbinden. Für Tinifile musst du die Unit inifiles einbinden. Eine Komponente brauchst du für keine der Lösungen.

Wie man das einbindet :mrgreen:

Khabarakh 29. Okt 2005 17:53

Re: Daten in EXE speichern
 
Uff... du wolltest ursprünglich die Programmechse manipulieren, ohne die Grundlagen von Delphi zu kennen :shock: ?
Eine Seite, auf die oft verwiesen wird: http://www.dsdt.info/grundlagen/
=> http://www.dsdt.info/grundlagen/sprache/units.php

Luckie 29. Okt 2005 18:07

Re: Daten in EXE speichern
 
Ich schließe den Thread an dieser Stelle, da zum einen das akteulle Problem nichts mehr mit dem ursprünglichen Thema zu tun hat und zum anderen die jetzt aufkommenden Fragen in neuen Threads mit entsprechendem Titel besser aufgehoben sind. Und ohne die nötigen Grundlagen hat es keinen Sinn hier weiter zu diskutieren oder helfen zu wollen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:27 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz