Autor |
Beitrag |
elinox
Hält's aus hier
Beiträge: 14
|
Verfasst: Do 12.09.02 01:35
Hallo,
Ich suche schon seit längerem eine Möglichkeit (Komponente oder Code oder ??? ) um während der Laufzeit von einem Programm eine Exe zu erzeugen.
Wenn einer ne Lösung weiss würde mich das sehr freuen .... Danke im Voraus
ELinOX
|
|
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 12.09.02 06:31
Du willst also eine Kompiler programmieren?
Dann fang schon mal an zu lesen:
www.microsoft.com/hw.../hardware/PECOFF.asp
(Link provided by NicoDE.)
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Do 12.09.02 09:16
Hallo,
oder willst du nur immer das selbe Programm an belibiger Position auf dem Massenspeicher erscheinen lassen? Dann musst du diese Standart EXE einfach in deine Recourcen mit einkompilieren. Wie das geht wird hier beschrieben.
Gruß
Klabautermann
|
|
elinox 
Hält's aus hier
Beiträge: 14
|
Verfasst: Do 12.09.02 10:45
Klabautermann :
Naja eben nicht es ändert sich immer ein bisschen was. Nehmen wir als Beispiel ... hmmm ... Grußkarten. Da ändert sich immer der Text in der Exe die vom Hauptprogramm erzeugt werden soll. Wenn ich alles in einer Extra Datei Speicher ( also den Text ) dann ist das wieder unpraktisch weil eine Grußkarte immernur aus einer EXE bestehen sollte.
Luckie :
Das ist interessante Kost. Aber ich denke für das Problem leicht übertrieben. Aber ich werde mich mal ein bisschen damit beschäftigen ... sieht lustig aus. 
|
|
MathiasSimmack
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 12.09.02 11:13
Das klingt nach folgender Lösung:
Du schreibst eine Standard-EXE, die dir später die Grußkarten anzeigen soll. Dann hängst du Text und evtl. Grafik an die EXE an und vermerkst dir, wo genau das losgeht und wie groß die einzelnen Teile sind. (Ebenfalls, indem du Startpunkt und Größe an die EXE hängst.)
Deine EXE muss natürlich so ausgerüstet sein, dass sie zur Laufzeit auf sich selbst zugreift, die angehangenen Daten findet (weil sie feststellt: "Hey, ich habe ja ein paar Kilo mehr auf den Hüften als ich sollte"  ), und dann kannst du mit den gefundenen Daten machen was immer du willst.
|
|
elinox 
Hält's aus hier
Beiträge: 14
|
Verfasst: Do 12.09.02 11:22
Hmmm das klingt nicht dumm.
Ja denn sag ich erstmal vielen Dank und ich werd's mal versuchen.
ELinOX
|
|
tommie-lie
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: Sa 14.09.02 20:24
Hallo,
Ich hätte auch gerne einen Rat zu diesem Thema. Eigentlich eine tiefergreifende Frage zu exakt diesem Thema....
Ihr kennt doch sicherlich alle diese schönen selbstentpackenden Archive?!?!
Wie kriege ich sowas auch hin, und zwar in einer einzigen Datei? Ich habe also ein paar Daten zusammengesammelt und in eine große Datei gepackt und mir natürlch "gemerkt" wo welche Datei anfängt. Ich brauche aber für's entpacken ein extra-Programm, daß dieses Paket wieder auspackt. Wie kann ich nun das Paket an die EXE hängen und wie speichere ich die Anfangs- und End-Position?
Im Prinzip will ich wissen WIE man Mathias' Lösung genau bearbeitet.
Tschüß
Thomas
edit: Ich präzisiere noch ein bisschen:
Ich will ein installationsprogramm machen, daß die Daten speichert und nachher wieder auspackt. Dazu sollen Einstellungen (Neustart nach der Installation?, DLLs?, ...) mitgespeichert werden. Alles soll nachher in einem einizgen Programm drin sein. Das Programm wird durch ein anderes erzeugt, daß die Daten sammelt und komprimiert (und halt nachher irgendwie an das eigentliche Installationsprogramm hängt).
_________________ 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
|
|
Klabautermann
      

Beiträge: 6366
Erhaltene Danke: 60
Windows 7, Ubuntu
Delphi 7 Prof.
|
Verfasst: Sa 14.09.02 22:25
Hallo,
nur ein kleine denkansatz (muss weg  ).
Wie du richtig festgestellt hast benögst du nur Anfangs und Endposition des Anhangs. Im speicher hast du die sagen wir mal in Variablen vom Typ Cardinal gespeichert. Diese beiden Typen hängst du jetzt auch noch an deine Datei. Du weißt, das ein Cardinal 4 Byte groß ist. Jetzt liest du die beiden letzten 4 Byte Blöcke deiner Datei wieder in zwei Variablen vom Typ Cardinal ein und hast die Positionen zürückgewönnen. Eigentlich Brauchst du sogar nur die Anfangsposition zu speichern. Dann list du von Anfangsposition - Dateilänge - 4.
Gruß
Klabautermann
|
|
F***Racism
Hält's aus hier
Beiträge: 9
Win XP
D7 Ent
|
Verfasst: Sa 14.09.02 22:50
Oder du nimbst einen eindeutig erkennbaren String der die EXE und den ANHANG trennt. Allerdings weis ich ned was in einer Exe ganz sicher nicht vorkommt was dazu dienen könnte
_________________ ROMAN KELLER
Smoke dope for hope!
|
|
F***Racism
Hält's aus hier
Beiträge: 9
Win XP
D7 Ent
|
Verfasst: Sa 14.09.02 22:53
Bei
[url] www.delphi-source.de[/url] gibts dazu ein Tut:
Zitat: | Wie kann ich Daten an eine Exedatei anhängen und dann auslesen?
Will man eine Applikation mit nur einer Exe-Datei veröffentliche, so kann man benötigte(n) Datei(en) einfach an die Exe-Datei anhängen. Ein Lesen mittels der Delphi-Routinen "AssignFile", "BlockRead" etc. funktioniert dann aber nicht mehr.
Hierzu wird das Programm erst einmal "so" kompiliert. Wenn man dann weiß, wie groß das kompilierte Programm ist, kann dieser Wert in "Exesize" eingetragen, das Programm neu kompiliert und anschließend die Datei angehängt werden.
Folgender Code ließt die angehängte Datei aus, schreibt sie in "test.bmp" und lädt sie anschließend in "Image1".
Anschließend der Code, der eine Datei "aufzaehl.bmp" an die Exedatei "project1.exe" anhängt.
Zugeben, es ist etwas lästig, immer zu schauen, ob die Größe der Exedatei auch stimmt. Wie man aber direkt aus einer Exedatei deren Größe erhalten kann ist mir leider nicht bekannt. Außerdem ist ein solches Vorgehen ja sowieso erst anzuraten, wenn das Programm (ansonsten) schon fertig ist.
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:
| const ExeSize=205312; // Größe der kompilierten Exe-Datei. ... // zum Laden var aHdl:Integer; aBuf:Array[1..40000] of byte; Gelesen: LongInt; f:file; begin aHdl:=FileOpen(Application.ExeName,fmShareDenyNone or fmOpenRead); FileSeek(aHdl,ExeSize,0); AssignFile(f,'test.bmp'); ReWrite(f,1); Gelesen:=FileRead(aHdl,aBuf,SizeOf(aBuf)); while Gelesen>0 do begin BlockWrite(f,aBuf,Gelesen); Gelesen:=FileRead(aHdl,aBuf,SizeOf(aBuf)); end; CloseFile(f); FileClose(aHdl); Image1.Picture.Bitmap.LoadFromFile('test.bmp'); end;
// folgender Code hängt eine Datei an var f2:file; aHdl:Integer; gelesen:longInt; aBuf:Array[1..40000] of byte; Groesse:LongInt; begin AssignFile(f2,'Project1.exe'); // die Exedatei Reset(f2,1); Groesse:=FileSize(f2); CloseFile(f2);
aHdl:=FileOpen('project1.exe',fmOpenReadWrite); FileSeek(aHdl,Groesse,0); AssignFile(f2,'aufzaehl.bmp'); // die Datei, die angehängt werden soll. Reset(f2,1); while not Eof(f2) do begin BlockRead(f2,abuf,sizeof(abuf),gelesen); FileWrite(aHdl,abuf,gelesen); end; CloseFile(f2); end; |
Beitrag von Johannes Tränkle
Datum: 14.10.00
|
_________________ ROMAN KELLER
Smoke dope for hope!
|
|
tommie-lie
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: So 15.09.02 11:25
Danke,
Und ihr seid sicher, daß man die Daten nciht "auskommentieren" muss, also sich die EXE nciht daran stört, daß da noch mehr ist als nur Programmcode?
Wenn ich des Antirassisten Code richtig gelesen habe, brauche ich die endgültige Größe der Datei nur zum lesen, das Codebeispiel sucht sich beim "Anhängen" die Größe selber heraus, richtg?
Tschüß
Thomas
_________________ 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
|
|
F***Racism
Hält's aus hier
Beiträge: 9
Win XP
D7 Ent
|
Verfasst: So 15.09.02 11:44
Aber das Beispiel ist wenn man es in die Selbe Exe schreiben will.
Wenn du nun von einer Anderen Exe aus reinschreiben willst, muss die schreib-Procedure in der Anderen Exe liegen und die Lese-Prozedure muss in der "erstellten" Exe liegen!
_________________ ROMAN KELLER
Smoke dope for hope!
|
|
tommie-lie
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: So 15.09.02 16:15
Ja das ist mir klar.
So blöd bin ich auch nicht, auch wenn meine Fragen das vielleicht vermuten ließen...
Tschüß
Thomas
_________________ 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
|
|
F***Racism
Hält's aus hier
Beiträge: 9
Win XP
D7 Ent
|
Verfasst: So 15.09.02 16:24
Das hat doch nix mit blöd zu tun!
Falls es so rüberkamm als ob ich das damit sagen wollte dann kann ich nur sagen ich es nicht so meinte 
_________________ ROMAN KELLER
Smoke dope for hope!
|
|
tommie-lie
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: So 15.09.02 18:01
Na, wenn du mir sagst, daß ich die schreiben-Prozedur in das Programm machen muss, daß das Paket schreibt, und die lesen-Prozedur in das Programm, das wieder ausliest, dann klingt das doch etwas ... blöd, oder?
Aber iss schon okay
Tschüß
Thomas
_________________ 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
|
|
F***Racism
Hält's aus hier
Beiträge: 9
Win XP
D7 Ent
|
Verfasst: So 15.09.02 18:13
K, hasch ja recht war aber ned böse gemeint 
_________________ ROMAN KELLER
Smoke dope for hope!
|
|
tommie-lie
      
Beiträge: 4373
Ubuntu 7.10 "Gutsy Gibbon"
|
Verfasst: So 15.09.02 20:59
Hab ich ja auch nciht böse verstanden. Dumm daß man beim Texten den Tonfall nicht mitanzeigen kann. Das sollet man irgendwie ändern *g*
Tschüß
Thomas
_________________ 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
|
|