Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Dateien an eine exe Datei mit dranhängen (https://www.delphipraxis.net/13812-dateien-eine-exe-datei-mit-dranhaengen.html)

Eagelone 27. Dez 2003 12:01


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:
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;
Habe das von SwissDelphiCenter.
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:
 
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;
Und jetzt ist das Problem, wie ich die wieder einlese.
Bis her habe ich das so gemacht:

Delphi-Quellcode:
    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 kann ich nun das gleiche damit erreichen, aber so, dass die beiden Dateien trotzdem an die exe-File mit rangehängt werden?

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

himitsu 27. Dez 2003 12:35

Re: Dateien an eine exe Datei mit dranhängen
 
Schau dir mal dazu Luckie's SFX-Tool an, das mach sowas.

Luckie's Downloadbereich -> SFXTools.zip


Aber in Blick in die DP-Suche hätte das auch schon geklärt.
[dp]Datei anhängen[/dp]

Eagelone 27. Dez 2003 13:20

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

cyberbobby 30. Dez 2003 17:00

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" ?

Inno Setup 3

ciao, cyberbobby

Eagelone 30. Dez 2003 17:09

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!

Luckie 30. Dez 2003 17:21

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?

Eagelone 30. Dez 2003 17:26

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?

cyberbobby 30. Dez 2003 17:33

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

bttb930 13. Jan 2004 09:28

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;

Motzi 13. Jan 2004 09:40

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 www.x-spy.net/personal


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:57 Uhr.
Seite 1 von 2  1 2      

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