![]() |
Dateien an eine exe Datei mit dranhängen
Hallo liebe Community!
Ich habe folgendes Problem: Ich habe mir ein Programm geschrieben, was aus 2 Teilen besteht: Dem Wizard zum Erstellen von 2 Konfigurationsdateien und dem Hauptprogramm was Informationen aus den beiden Konfigurationsadateien ausliest. Jetzt möchte ich es so machen, dass der Wizard die 2 erstellten Konfiguartionsdateien mit an die exe-Datei des Hauptprogrammes anhängt bzw. einbindet. Weil im Moment muss ich immer alle 3 Dateien weitergeben: Die 2 Konfigurationsdateien und das Hauptprogramm. Und das soll dann jetzt alles nur noch eine Datei sein! Das habe ich jetzt so realisiert:
Delphi-Quellcode:
Habe das von SwissDelphiCenter.
function AttachToFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean;
var aStream: TFileStream; iSize: Integer; begin Result := False; if not FileExists(AFileName) then Exit; try aStream := TFileStream.Create(AFileName, fmOpenWrite or fmShareDenyWrite); MemoryStream.Seek(0, soFromBeginning); // seek to end of File // ans Ende der Datei Seeken aStream.Seek(0, soFromEnd); // copy data from MemoryStream // Daten vom MemoryStream kopieren aStream.CopyFrom(MemoryStream, 0); // save Stream-Size // die Streamgröße speichern iSize := MemoryStream.Size + SizeOf(Integer); aStream.Write(iSize, SizeOf(iSize)); finally aStream.Free; end; Result := True; end; function LoadFromFile(const AFileName: string; MemoryStream: TMemoryStream): Boolean; var aStream: TFileStream; iSize: Integer; begin Result := False; if not FileExists(AFileName) then Exit; try aStream := TFileStream.Create(AFileName, fmOpenRead or fmShareDenyWrite); // seek to position where Stream-Size is saved // zur Position seeken wo Streamgröße gespeichert aStream.Seek(-SizeOf(Integer), soFromEnd); aStream.Read(iSize, SizeOf(iSize)); if iSize > aStream.Size then begin aStream.Free; Exit; end; // seek to position where data is saved // zur Position seeken an der die Daten abgelegt sind aStream.Seek(-iSize, soFromEnd); MemoryStream.SetSize(iSize - SizeOf(Integer)); MemoryStream.CopyFrom(aStream, iSize - SizeOf(iSize)); MemoryStream.Seek(0, soFromBeginning); finally aStream.Free; end; Result := True; end; procedure TForm1.SaveClick(Sender: TObject); var aStream: TMemoryStream; begin aStream := TMemoryStream.Create; Memo1.Lines.SaveToStream(aStream); AttachToFile('Test.exe', aStream); aStream.Free; end; procedure TForm1.LoadClick(Sender: TObject); var aStream: TMemoryStream; begin aStream := TMemoryStream.Create; LoadFromFile('Test.exe', aStream); Memo1.Lines.LoadFromStream(aStream); aStream.Free; end; Ist das eine vernünfitige Lösung oder gibt es noch eine bessere? Wenn das die Beste ist, dann folgende Fragen: Die eine Datei von meinen beiden Konfigurationsdateien ist im Ini-Format. Da ist das Einlesen kein Problem, aber die andere Datei wird bei mir wie folgt erstellt:
Delphi-Quellcode:
Und jetzt ist das Problem, wie ich die wieder einlese.type TProdukt = record Nummer: integer; Beschreibung: string[200]; Preis: real; end; begin AssignFile(datei, 'test.abc'); // Dateizuweisung Rewrite(datei); // Erstellt die Datei for i := 0 to Produkte.Items.Count - 1 do // Durchläuft alle Zeilen wobei Produkte eine TListView-Komponente ist with Produkte.Items.Item[i] do begin datensatz.Nummer := StrToInt(Caption); // Spalte 1 datensatz.Beschreibung := SubItems.Strings[0]; // Spalte 2 datensatz.Preis := StrToFloat(SubItems.Strings[1]); // Spalte 3 write(datei, datensatz); // Schreibt die Datei end; CloseFile(datei); end; Bis her habe ich das so gemacht:
Delphi-Quellcode:
Wie kann ich nun das gleiche damit erreichen, aber so, dass die beiden Dateien trotzdem an die exe-File mit rangehängt werden?
AssignFile(datei, 'test.abc');
Reset(datei); i := 0; while (not EOF(datei)) do begin SetLength(produkte, i + 1); read(datei, produkte[i]); cbProdukt1.Items.Add(produkte[i].Beschreibung); // cbProdukte ist jeweils eine Combobox cbProdukt2.Items.Add(produkte[i].Beschreibung); cbProdukt3.Items.Add(produkte[i].Beschreibung); cbProdukt4.Items.Add(produkte[i].Beschreibung); cbProdukt5.Items.Add(produkte[i].Beschreibung); inc(i); end; CloseFile(datei); Wie sicher sind die Daten, die ich an die exe-Datei mitranhänge? Sollte ich die noch verschlüsseln mit RSA oder so bzw. lohnt es sich? Kann die eigtl. exe-Datei irgendwie Schaden nehmen oder kann es da zu unerwarteten Fehlern kommen? Hoffe, dass ihr mir helfen könnt! Danke im Voraus! Eagelone |
Re: Dateien an eine exe Datei mit dranhängen
Schau dir mal dazu Luckie's SFX-Tool an, das mach sowas.
![]() Aber in Blick in die DP-Suche hätte das auch schon geklärt. [dp]Datei anhängen[/dp] |
Re: Dateien an eine exe Datei mit dranhängen
Hi,
danke für den Tipp. Aber irgendwie glaube ich, dass ich was anderes meine, als die Funktionen von dem SFX-Tool. Oder irre ich mich da? Und die DP-Suche hat mir meine Fragen nicht beantwortet. :wink: Ich habe nämlich die SuFu vorher schon gecheckt. Eagelone |
Re: Dateien an eine exe Datei mit dranhängen
Hi, warum machst Du Dir das Leben nicht leicht und nimmst einfach den Inno Setup Compiler und ersparst Dir das "Wizard-Selberschreiben" ?
![]() ciao, cyberbobby |
Re: Dateien an eine exe Datei mit dranhängen
Der Wizard für die beiden Konfigurationsdateien und das Hauptprogramm ist ja fertig!
Ich möchte ja jetzt nur noch, dass die beiden Konfiguationsdateien nicht mit dem Programm mitgeliefert werden müssen, sondern direkt an dem Programm mit dranhängen! |
Re: Dateien an eine exe Datei mit dranhängen
Das dir da jedes mal der Virenscanner sagt, das die Exe verändert wurde ist dir bewusst oder?
Aber wie dem auch sei, warum geht es denn im Prinzip nicht so, wie bei meinem SFX-Tool? |
Re: Dateien an eine exe Datei mit dranhängen
Hi Luckie!
Achso, das ist dann scheisse! Geht das denn so, wie ich meine? Also das mein Konfigurationsprogramm 2 Stringlisten an das Hauptprogramm dranhängt und das dann die Stringlisten auslesen kann? |
Re: Dateien an eine exe Datei mit dranhängen
Also, da Du anscheinend kein Freund von Paketen, Gepacktem oder Vorgefertigtem bist, schlage ich Dir vor - wenn es sich nicht um hochkomplexe oder generierte Konfigurationsdateien (obwohl auch das geht) handelt, die Dateien nicht mit dranzuhängen, sondern sie durch den Wizard oder das Programm beim Erststart erstellen, also schreiben zu lassen. (kleine Routine, die überprüft, ob eine eventuelle Datei schon vorhanden ist und wenn nicht, dann erstellen.)
vielleicht hilft`s ciao, bobby |
Re: Dateien an eine exe Datei mit dranhängen
ich hab sowas auch mal gemacht: Ich habe sfs-dateien an exe-dateien angehängt, das geht aber auch mit allen anderen dateien, und zwar hab ich das so gemacht:
Delphi-Quellcode:
function AppendSFSFileToExe(const aExeFile, aSFSFile, aOutFile: string): Boolean;
var ExeStream, SFSStream, OutStream: TFileStream; SizeExe, SizeSFS: LongInt; begin Result := False; if (aSFSFile <> '') and (aExeFile <> '') then begin OutStream := TFileStream.Create(aOutFile, fmCreate); ExeStream := TFileStream.Create(aExeFile, fmOpenRead); SFSStream := TFileStream.Create(aSFSFile, fmOpenRead); OutStream.CopyFrom(ExeStream, ExeStream.Size); OutStream.CopyFrom(SFSStream, SFSStream.Size); SizeExe := ExeStream.Size; SizeSFS := SFSStream.Size; OutStream.Write(SizeExe, SizeOf(SizeExe)); OutStream.Write(SizeSFS, SizeOf(SizeSFS)); ExeStream.Free; SFSStream.Free; OutStream.Free; Result := True; end; end; function ExtractSFSFileFromExe(const aFileName: string): string; var InStream, SFSStream: TFileStream; SizeExe, SizeSFS: LongInt; SFSFile: string; begin Result := ''; if not FileExists(aFileName) then exit; InStream := TFileStream.Create(aFileName, fmOpenRead); InStream.Position := InStream.Size - SizeOf(SizeExe) - SizeOf(SizeSFS); InStream.Read(SizeExe, SizeOf(SizeExe)); InStream.Position := InStream.Size - SizeOf(SizeSFS); InStream.Read(SizeSFS, SizeOf(SizeSFS)); if SizeExe + SizeSFS + SizeOf(SizeExe) + SizeOf(SizeSFS) <> InStream.Size then InStream.Free else begin SFSFile := utlWindows.GetTempFileName('.sfs'); SFSStream := TFileStream.Create(SFSFile, fmCreate); InStream.Position := SizeExe; SFSStream.CopyFrom(InStream, SizeSFS); SFSStream.Free; InStream.Free; Result := SFSFile; end; end; |
Re: Dateien an eine exe Datei mit dranhängen
Also ich hab mir für sowas eine kleine Komponente namens "TExtraResManager" gebastelt.. findet man unter
![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:55 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