| Autor |
Beitrag |
mimi
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Di 21.10.03 18:51
Hallo,
ich habe ein datei arichver geschrieben(mit pack funktion) und möchte jetzt damit eigne SFX dateien erstellen.
was ist der beste weg ?
ich wollte es so machen:
ich schreibe nur einen entpacker dem das arichv als res datei mit compliert wird.
da stellt sich die frage wie kann ich res dateien zu laufzeit berabeiten und drauf zu greifen ???
kennt ihr noch einen besseren weg ?
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
tommie-lie
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Di 21.10.03 22:11
Anstatt eine Ressource, kannst du auch einfach die Dateien binär an den Entpacker dranhängen.
Der Entpacker muss "wissen" wie lang er eigentlich ist (bsp: 100kb). Jetzt sind hinter dem Entpacker noch 50 kb gepackte Informationen. Der Entpacker sucht also in sich selber zum 100.000 Byte (100 kb) und findet von da an die gepackten Daten. Die liest er aus, entpackt sie und fertig. Damit erspart man sich die Ressourcen.
_________________ Your computer is designed to become slower and more unreliable over time, so you have to upgrade. But if you'd like some false hope, I can tell you how to defragment your disk. - Dilbert
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Mi 22.10.03 09:45
Auf www.x-spy.net/personal findest du meine TExtraResManager-Komponente, mit der lässt sich das was tommie-lie vor mir beschrieben hat sehr einfach, komfortabel und effektiv lösen...!
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Mi 22.10.03 17:14
ich würde es gerne selbst versuchen also ohne eine komponente.
könnt ihr mir vileicht tipps geben wie ich sowas mache, was tommie-lie beschrieben hat ?
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Mi 22.10.03 18:03
beschreib mal näher wo dein problem mit tommie-lie's möglichkeit liegt...
MrSaint
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 22.10.03 18:06
Sag mal, mimi, kannst du nicht lesen was da steht?
Oder verstehst du es nicht?
Wie funktioniert dein Archivprogramm denn bisher? Es öffnet das Archiv und entpackt die Dateien. Richtig?
Jetzt nimmst du lediglich den Entpack-Code in eine eigenständige Exe. Diese Exe hat später eine ganz bestimmte Größe. Das heißt, du benötigst erst mal eine Art Dummy-Variable
Quelltext
Dann kompilierst du dein Programm und stellst fest, wie groß es ist. Sagen wir 35.000 Bytes. Diesen Wert trägst du in obige Variable ein und damit kennt der Entpacker schon mal seine eigene Größe.
Was du jetzt tun musst, ist lediglich die Logik ändern. Wenn du vorher auf ein extra Archiv zugegriffen hast, greifst du jetzt auf die Exe selbst zu. Sprich: der Entpacker öffnet sich quasi selbst und springt an sein Ende, denn hier beginnt das angehängte Archiv. Wie weit du springen musst, um zum Archivbeginn zu gelangen, das weißt du von der o.g. Variablen.
Wie kannst du deinen Entpacker testen, ohne gleich ein riesiges Programm dafür schreiben zu müssen? Du nimmst die kompilierte Exe und ein Testarchiv und fügst beides zusammen
Quelltext 1:
| copy /b loader.exe + testarchiv.??? meine-erste-sfx.exe |
Damit wird das Archiv an die Exe angehangen, und du hast was zum Probieren.
Letzter Schritt: du legst die kompilierte Exe deinem Archivprogramm bei und bietest eine SFX-Option an. In dem Fall macht dein Programm nichts anderes als du zuvor. Es erzeugt das Archiv und kopiert dann den Entpacker und das Archiv zusammen.
Voilà. Problem gelöst.
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Mi 22.10.03 18:16
verstanden habe ich das schon.
macht das denn nichts aus wenn ich einer exe datei daten anhänge und zwar am ende ?
damit verände ich die exe datei.
naja, ich werds mal ausprobieren *G*
Edit:
Danke für die vorschläge.
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 22.10.03 18:20
| mimi hat folgendes geschrieben: | | verstanden habe ich das schon. |
Offensichtlich nicht.
| Zitat: | macht das denn nichts aus wenn ich einer exe datei daten anhänge und zwar am ende ?
damit verände ich die exe datei. |
Nein, die Exe ändert sich dadurch nicht. Sie wird nur ... na sagen wir: ergänzt. Solche Spielchen habe ich schon mit TurboPascal gemacht. Dass hinten an der Datei noch was dran hängt, interessiert normalerweise nicht, wenn du den Exe-Startcode nicht beschädigst. Und das tust du eigentlich nicht, wenn du mit dem gezeigten Copy-Befehl arbeitest, bzw. die Exe und das Archiv aus deinem Programm heraus zusammenfügst.
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Mi 22.10.03 18:22
nee, da passiert nix, solange deine dateigröße insgesamt durch 8 (glaub ich) teilbar bleibt. windows überprüft die teilbarkeit glaub und ließt dann aus dem EXE-Header die größe der datei aus und führt sie dann bis zu diesem 'Punkt (dem Ende der EXE) aus.
MrSaint
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
MrSaint
      
Beiträge: 1033
Erhaltene Danke: 1
WinXP Pro SP2
Delphi 6 Prof.
|
Verfasst: Mi 22.10.03 18:24
@MathiasSimmak: DOS hat damals glaub die Dateigröße nich überprüft...
hatte das damals mit TurboPascal auch schon gemacht und als ich dann n TP-Programm nach Windows "exportiert" hab, gings nemme... das war die Dateigröße... wie gesagt... ich mein durch 8 musste das teilabr sein... vielleicht auch 16 oder 32... k.A.
MrSaint
_________________ "people knew how to write small, efficient programs [...], a skill that has subsequently been lost"
Andrew S. Tanenbaum - Modern Operating Systems
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Mi 22.10.03 18:27
ich habe ebend ein test gemacht und die exe datei ging noch nach dem ich mit dem das copy behfel daten hangeängt hatte. morgen werde ich es dann weiter ausbauen.
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 22.10.03 21:39
So, da sich Popv beschwert habe ich würde nur sinnfrei beiträge erstellen. Hier meine Lösung mit Source:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51:
| const FILESIZE = 391680; BLOCKSIZE = 32256;
function Min(x, y: Cardinal): Integer; begin if x < y then result := x else result := y; end;
function Extract(SFXArchive, DestFile: String; SFXFileSize: LongInt): Integer; var FSFXArchive, FDestFile: File of Byte; MemBuffer : array [0..BLOCKSIZE-1] of Byte; BytesRead: Integer; begin SetLastError(0); {$IOCHECKS OFF} AssignFile(FSFXArchive, SFXArchive); FileMode := fmOpenRead; Reset(FSFXArchive); if IOResult = 0 then begin AssignFile(FDEstFile, DestFile); Rewrite(FDestFile); if IOResult = 0 then begin Seek(FSFXArchive, SFXFileSize); while not EOF(FSFXArchive) do begin BlockRead(FSFXArchive, MemBuffer, sizeof(MemBuffer), BytesRead); BlockWrite(FDestFile, MemBuffer, BytesRead); end; end; CloseFile(FDestFile); end; CloseFile(FSFXArchive); {$IOCHECKS ON} result := GetLastError(); end;
procedure TForm1.btnExtractClick(Sender: TObject); var ECode: Integer; begin ECode := Extract('SFX.exe', edtFile.Text, FILESIZE); if ECode <> 0 then ShowMessage(SysErrorMessage(ECode)); end; |
Die Konstante FILESIZE bezeichnet die genaue Größe der Exe an die eine Datei drangehängt wird.
Zusammengestzt wird es wie folgt:
Quelltext 1:
| D:\Programmierung\Delphi\Programme\VCL\Ideen\SFX>copy /b extractor.exe + test.mp3 sfx.exe |
Fehlerbehandlung etc ist alles schon drin.
|
|
obbschtkuche
Gast
Erhaltene Danke: 1
|
Verfasst: Mi 22.10.03 21:43
Ist die 32256 ein Zufallsprodukt? Ansonsten würde ich 32768 nehmen ;)
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Mi 22.10.03 21:47
Ich habe gewüfelt.
Nein, da habe ich mich vertan.
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Do 23.10.03 09:16
Da es etwas mühsam ist nach jeder Nuekompilierung möglicherweise die neue Größe der Exe einzutragen hab ich mir für meine Komponente etwas anderes überlegt... erstens braucht man die Größe der Exe nicht zu kennen und zweitens ist noch ein Sicherheits check drinnen. Das ganze Funktioniert so:
vor dem Anhängen wird ein SHA1-Hash der "ExtraResourcen" berechnet, dann wird an die Exe angehängt, und zwar in folgender Reihenfolge:
Quelltext 1: 2: 3: 4:
| Hashwert ExtraResourcen Hashwert Größe der Resourcen |
Beim auslesen wird dann mal die Größe und der zweite Hashwert ausgelesen. Dann seek ich (ich kenn ja die Größe) zum ersten Hashwert - damit kann ich mal die zwei Hashes vergleichen (erster Sicherheitscheck), dann wird der Hash der ExtraResourcen berechnet und wieder verglichen (zweiter Sicherheitscheck). Und erst wenn diese Überprüfungen erfolgreich waren werden die ExtraResourcen "geladen".
Du kannst dir ja einfach mal den Code der Komponente ein bisschen anschaun. Alternativ kann ich dir noch meinen Tipp im SwissDelphiCenter empfehlen: www.swissdelphicente.../showcode.php?id=815 (dieser Code hat zwar nicht die Sicherheitschecks drinnen, ist aber unabhängig von der eigentlichen Größe der Exe)
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 23.10.03 09:25
Kompilierst du die dateien als Ressource ein oder wie darf man das verstehen?
Ansonsten gibt es hier ein vollfunktionstüchtiges Demo für bis zu 99 Dateien:
www.delphipraxis.net..._sfxarchivmaker.html
Ausführliche Erklärung im Posting.
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Do 23.10.03 11:34
Meinst du mich..?
Nein, ich kompiliere sie nicht mit ein, sondern hänge sie auch einfach hinten an die Exe an...
Mit meinem TExtraResManager geht das sehr einfach und komfortabel:
es wird eine Liste von TExtraResourcen verwaltet (theoretisch bis zu 65536 Stück), jede TExtraResource hat eine ID, einen Namen und einen Stream in dem die Daten stehen.
Die TExtraResourcen werden (beim erstellen) entweder komplett im Speicher (TMemoryStream) oder aber mit Hilfe von temporären Datein verwaltet (kann man einstellen)
Beim Auslesen kann man wahlweise die ExtraResourcen wieder komplett in den Speicher laden oder aber die Zugriffe werden direkt auf die Festplatte auf die Exe umgeleitet (read-only).
Mit der TExtraResourceStream-Klasse (abgeleitet von TStream) kann man auch ohne TExtraResManager gezielt auf einzelne ExtraResourcen direkt auf der Festplatte zugreifen (read-only).
Es gibt 3 Methoden mit denen man ganz einfach ExtraResourcen hinzufügen kann (AddNew (leere ExtraResource hinzufügen - kann man selber füllen), AddStream (Stream hinzufügen), AddFile (File hinzufügen))
Neben der Methode SaveToEXEFile gibt es auch eine Methode SaveToTMPFile mit der die gesamten ExtraResourcen mit ihren zusätzlichen Infos in einer eigenen Datei gespeichert werden können. Daher eignet sich der TExtraResManager auch recht gut für eigene Datei-Formate indem man die einzelne Abschnitte des Datei-Formats einfach in einzelne ExtraResourcen aufsplittet...
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 23.10.03 17:29
Also arbeitest du mit Ressourcen. ich hänge ja die nackten Dateien hinten dran. Und so werde ich auch das Ding auch weiter entwicklen. Erstmal bis zu dem Punkt, wo auch Verzeichnisstrukturen erhalten bleiben.
|
|
mimi 
      
Beiträge: 3458
Ubuntu, Win XP
Lazarus
|
Verfasst: Do 23.10.03 18:20
dank für die die antworten, ich werde es jedoch selbst machen und nicht auf irgenwelche komponenten zurückgreifen
ich habe gestern angefangen das anhägen an der exe datei zu estellen.
heute wird dann der stream wieder ausgelesen und bearbeitet.
_________________ MFG
Michael Springwald, "kann kein englisch...."
|
|
Motzi
      
Beiträge: 2931
XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
|
Verfasst: Do 23.10.03 20:10
Nein, keine Resourcen... ich nenne sie nur "ExtraResourcen", werden aber auch nur einfach hinten an die Exe angehängt!
@mimi: schon klar.. hab auch nur gemeint du könntest dir bei Interesse ja den Code anschaun...
_________________ gringo pussy cats - eef i see you i will pull your tail out by eets roots!
|
|