Autor Beitrag
mimi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic star
Beiträge: 4373

Ubuntu 7.10 "Gutsy Gibbon"

BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: 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



BeitragVerfasst: 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
ausblenden Quelltext
1:
2:
const
  iSfxLen = 0;

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
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1033
Erhaltene Danke: 1

WinXP Pro SP2
Delphi 6 Prof.
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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



BeitragVerfasst: 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:
ausblenden volle Höhe Delphi-Quelltext
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-1of 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:
ausblenden 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



BeitragVerfasst: Mi 22.10.03 21:43 
Ist die 32256 ein Zufallsprodukt? Ansonsten würde ich 32768 nehmen ;)
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 22.10.03 21:47 
Ich habe gewüfelt. :wink:

Nein, da habe ich mich vertan.
Motzi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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:
ausblenden 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



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3458

Ubuntu, Win XP
Lazarus
BeitragVerfasst: 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 :D

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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2931

XP Prof, Vista Business
D6, D2k5-D2k7 je Prof
BeitragVerfasst: 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!