Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   SFXer - Ein SFX-zlib-Packer (https://www.delphipraxis.net/55240-sfxer-ein-sfx-zlib-packer.html)

Hador 18. Okt 2005 14:48


SFXer - Ein SFX-zlib-Packer
 
Liste der Anhänge anzeigen (Anzahl: 2)
Auf längere Sicht habe ich vor, mir ein eigenes Setup-Tool zu schreiben. Als Vorbereitung auf dies, habe ich jetzt erst einmal ein SFX Tool entwickelt, welches (auch mehrere Dateien) mit Hilfe der zlib packt und an eine Echse dranhängt, so dass sich das ganze von selbst auch wieder entpacken lässt.

Was noch fehlt:
  • Den Dateinamendialog im Packer durch einen SaveDialog ersetzen //EDIT: Nur noch in der Parameterversion//
  • Verzeichnisstrukturen mit Packen
  • Versuchen das SFX Modul noch weiter zu verkleinern (z.Z. 47,5 kb)

Ich habe 2 Verschiedene Versionen erstellt.
Die erste (SFXer) werden die zu packenden Dateien per Parameter übergeben (as ganze soll später über Senden An laufen)
Die zweite (ODSFXer) hat einen OpenDialog, in dem die Dateien ausgewählt werden können.

Ich würde mich freuen, wenn einige das Tool mal testen könnten.
Die angehängten Dateien wurden übrigends auch mit diesem Tool erstellt.

EDIT: Nur die Packer.exe ist wichtig. SFX.exe ist das Modul, wo die Dateien rangehängt werden. Und das erwartet, das mindestens eine Datei rangehängt ist. Daher sollte es nicht so ausgeführt werden.

Luckie 18. Okt 2005 14:59

Re: SFXer - Ein SFX-zlib-Packer
 
Wie bedient man das? Ich habe ein sfx-Archiov erstellt und ahtte dann im Verzeichnis eine SFX.exe (48 KB) und eine ODPacker.exe (408 KB).

Nach dem Ausführen der SFX.exe bekam ich folgende Fehler:
Zitat:

---------------------------
SFX.exe - Fehler in Anwendung
---------------------------
Die Ausnahme "Unbekannter Softwarefehler" (0x0eedfade) ist in der Anwendung an der Stelle 0x77e9bc3f aufgetreten.


---------------------------
OK Abbrechen
---------------------------
Zitat:

---------------------------
Anwendungsfehler
---------------------------
Exception EConvertError in Modul SFX.exe bei 00006EC2.

'' ist kein gültiger Integerwert.


---------------------------
OK
---------------------------
Wie hast du die zLib so klein bekommen, dass sie nonVCL ist?

Kannst du mir mal das Prinzip erläutern? Ich habe bei meinem SFX-Tools einen Dateiheader mit den den im Archiv enbthaltenen Dateien und deren Größen. Du müsstest dann ja beim Erstellen des SFX-Archives wissen, wie großt die dateien genau sind, wenn sie gepackt sind oder?

Hador 18. Okt 2005 16:11

Re: SFXer - Ein SFX-zlib-Packer
 
:oops: Hab vergessen zu sagen, dass nur die Packer.exe wichtig ist. SFX.exe ist das Modul, wo die Dateien rangehängt werden. Und das erwartet, das mindestens eine Datei rangehängt ist.

In dem nachher erstellten inputDialog kannst du dann den Dateinamen des SFX archieves angeben.

Beim aneinanderhängen der Dateien muss ich zugeben, dass ich etwas geschummelt habe. Dafür habe ich folgenden Code aus dem EDH benutzt:

Delphi-Quellcode:
procedure Join(Main_FileName, Hidden_Filename : string);
var
  MainFile   : TFileStream;
  HiddenFile : TFileStream;
  SizeOfFile : Cardinal;
  SearchWord : string[10];
begin
  MainFile      := TFileStream.Create(Main_FileName, fmOpenReadWrite or fmShareDenyWrite);
  try
    SizeOfFile    := MainFile.Size;
    HiddenFile    := TFileStream.Create(Hidden_Filename, fmOpenRead or fmShareDenyNone);
    try
      MainFile.Seek(0, soFromEnd);
      MainFile.CopyFrom(HiddenFile, 0);
      MainFile.Seek(0, soFromEnd);
    finally
     HiddenFile.Free;
    end;
    SearchWord := IntToStr(SizeOfFile) + #0;
    MainFile.Seek(0, soFromEnd);
    MainFile.WriteBuffer(SearchWord, SizeOf(SearchWord));
  finally
   MainFile.Free;
  end;
end;
Und zum splitten
Delphi-Quellcode:
procedure Split(Main_FileName, NewFromMain_Filename : string);
var
  MainFile : TFileStream;
  SplitFile : TFileStream;
  HelpStr  : string[10];
  GetSize  : integer;
begin
  MainFile   := TFileStream.create(Main_FileName, fmOpenReadWrite or fmShareDenyWrite);
  try
    SplitFile := TFileStream.Create(NewFromMain_Filename, fmCreate or fmShareDenyNone);
    try
      MainFile.Position  := MainFile.Size - 11;
      MainFile.Read(HelpStr, 10);
      GetSize := StrToInt(HelpStr);
      MainFile.Position := GetSize;
      SplitFile.CopyFrom(MainFile, MainFile.Size-GetSize);
      SplitFile.Size := SplitFile.Size - 11;
      MainFile.Size := GetSize;
    finally
     SplitFile.Free;
    end;
  finally
   MainFile.Free;
  end;
end;
Das einzige was man im SFX Modul sieht ist Der Pfadauswahldialog. Diesen habe ich mittels der WinAPI Funktion SHBrowseForFolder aufgerufen.

Ansonsten habe ich einfach die zlib eingebunden, die zusammengepackten Dateien (Ich habe noch ne Datei, wo alle Dateinamen drinstehen mit angehängt) damit komprimiert und das ganze dann an das SFX-Modul angehängt.

Zitat:

Wie hast du die zLib so klein bekommen, dass sie nonVCL ist?
Also wenn ich die zlib in ein Konsolenprogramm einbinde, ist das Programm 85 kb groß. Mit UPX komprimiert (is auch sfx.exe) noch 38,5 kb


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

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