![]() |
.exe erstellen
alaoh
kann mir vllt jemand sagen was ich machen muss um ein programm zu haben mit dem ich ein anderes programm erstellen kann? klingt komisch... aber ich versuchs ma weiter zu erklären.... also ein kleines beispiel ich hab eine programm in das ich eine zahl eintippen kann dann klicke ich auf einen button und es wird eine neue datei erstellt wenn man diese datei öffnet kommt ne message mit der zahl die man zuvor angegeben hat allerdings soll diese datei nicht computer gebunden sein also ist es nicht möglich einfach die zahl irgendwo zu speichern (außer halt in der .exe selbst) |
Re: .exe erstellen
? Ne zahl erstellen, die ein anderes Programm lesen kann ist ok, aber nicht computergebunden?
Willst Du aus der ersten .exe mit der zweiten .exe die Zahl rauslesen? Puh! :gruebel: Formulier mal konkreter, dann kommst Du Deiner Lösung näher, bzw. es antwortet Dir auch jemand. :hi: |
Re: .exe erstellen
also ich will in programm eine zahl eintippen
dann klicke ich auf einen button dieser erstellt ein programm2 wenn man dann programm2 öffnet soll die zahl erscheinen die man in programm1 eingegeben hat diese zahl soll in der neu erstellten .exe enthalten sein also es soll so laufen als ob ich ein neues programm geschrieben hätte aber nur das dieses programm von meinem programm geschrieben wird |
Re: .exe erstellen
Er will aus seinem Programm aus weiter echsen erstellen
|
Re: .exe erstellen
Meiner meinung nach geht das nich direkt, du könntest aber eigendlich in der ersteller exe nen vertiges Prog zum ini öffnen 'verstecken', das dan Extrahiert wird, und dann die Zahhl aus einer .ini Ausliest, dafür sind dann aber zwei Dateien notwendig. Aber ich glaub, dass du das nich willst :wink:, du willst bestimmt prog's für andere leut machen, die sie nicht verändern können, schlaue Leute aber können das dann :cry: .
An dieser stelle frag i mich, warum ich das überhaupt getippt hab, wenn dus wahrscheinlich sobiso nich brauchs. |
Re: .exe erstellen
Zitat:
|
Re: .exe erstellen
also es ist möglich, denn es gibt ein Programm (mit Delphi 2 gemacht), mit dem jeder eigene Trainer (für Spiele) machen kann. Dabei kann man dann auch das Form selber anordnen und den Buttons und Edits zuweisen, was sie tun sollen.
Anschließend kommt EINE datei raus, eine EXE. |
Re: .exe erstellen
Hallo,
das kann schon sein, ich würde die Exe2 z.B. schon fertig als Ressource in Exe1 einbinden, dann entweder die Konfiguration des Forms in Exe2 als Extra-Datei erzeugen, die Exe2 dann ausliest und das Form und alle Form-elemente (Label, Edit) entsprechend selber zur Laufzeit erzeugt oder was schwieriger ist, die Konfigurationsdaten als Ressourcen in Exe2 ablegen. Grundprinzip ist aber immer, dass zumindestens eine lauffähige exe2 aschon vorhanden ist. Beginnen kann man bei Ressourcen mit LoadResource, FindResource. Wie man externe Dateien (Exe2) in andere eigene Programme als Ressourcen einbindet, findet man in google unter "Wave-Dateien einbinden" Heiko |
Re: .exe erstellen
Hrm.. da gabs mal was. Im Prinzip wird aus einer .exe eine Ressource extrahiert, diese geändert und wieder in die .exe gepackt. Such mal nach ressource und exe hier in der DP. Ich weiss, das wir das mal hatten, kann mich aber nicht an genauere Details erinnern.
|
Re: .exe erstellen
Wenn das geht, muss doch eigentlich dias ersteller prog nen compiller enthalten, und den kan man schlecht selber (in delphi) proggen (oder? :gruebel: ),
es sei denn es gibt in delphi language einen versteckten Befehl, der im fertigen progautomatisch nen compiller einbaut. :?: :!: :?: |
Re: .exe erstellen
Naja, möglich ist so etwa immer. Und etwas wie einen Trainer kann man auch per Exe + Ressource mit Konfiguration bauen. Man hat also seine Exe, an der hängt als resource die Trainer-exe dran. dann baut man in der exe seine oberfläche und seine befehle zusammen. das programm macht daraus einen konfigurationsdatensatz und hängt an die trainer-exe das dran und speichert das ganze auf platte.
Die trainer-exe muss jetzt nur noch die konfiguration interpretieren - et voila: man hat eine exe generiert. |
Re: .exe erstellen
Zitat:
|
Re: .exe erstellen
Im Grunde genommen kann man jede EXE-Datei beliebig vergrößern, indem man diese in einen Stream läd, dann ein paar Daten an den Stream dranhängt (z.B. deine Zahl) und dann diesen Stream wieder speichert. Die exe-Datei ist dann ein bischen größer, läuft aber m.W. nach immer noch. Diese "vergrößerte" EXE-Datei kann sich nun selber in einem Stream öffenen, an die Stelle mit den Daten springen und diese angehängten Daten auslesen und anzeigen.
Was du also machen musst, sind zwei Programme schreiben. Programm1 ist das Anzeigeprogramm, dem die Daten angehängt werden. Programm2 bietet die Eingabe einer Zahl, läd das (fertige) Programm1 in einen Stream, hängt die Daten an das Ende des Streams und speichert es unter einem anderen Dateinamen (Programm3.exe) ab. Schwupp, da hast du ein Programm, welches individuelle Daten beinhaltet. Gerd |
Re: .exe erstellen
es gibt hier bei freeware oder Open Source ein programm, das Exe-Diashows erstellt... musst halt mal sehen, ob ihr da den source ansehen kannst.
|
Re: .exe erstellen
ich hab mal gesucht aber nur das gefunden
![]() aber mir ist eben noch eine andere idee gekommen man könnte doch einfach eine datei in den ordner der datei speichern dann überprüft das programm ob die datei vorhanden ist wenn ja dann kann man die einstellungen vornehmen und wenn nicht dann halt eben nicht.... das einzige problem was dann noch da wäre das man die sachen ja in der datei selbst speicher müsste... |
Re: .exe erstellen
Ich werd dir mal helfen, wenns sonst keiner kann/will!
Hier haste nen Beispiel wie man das realisieren kann. Kann sein, dass der Code Fehler hat, hab grad kein Delphi drauf, sonder nur den Texteditor. Also der Code macht im Grunde folgendes: Er kopiert ein EXE und hängt eine Configdatei an die EXE, in welcher die zu speichernden Werte stehn. Er kann diese Werte wieder auslesen und dann ist es ja möglich von vorne zu beginnen. Ich hab es mal für einen EditServer benutzt und schnell etwas umgeschrieben. PS: Um irgendetwas von einer EXE laden zu können musst du sie natürlich vorher bearbeitet haben. Es wäre also sinnvoll die EXE nach dem kompilieren zu bearbeiten, damit sie sich selbst weiter verarbeiten kann. Hier zum Code:
Delphi-Quellcode:
uses
IniFiles; function CreateConfigFile: TStrings; var ConfigFile: TStrings; begin ConfigFile := TStringList.Create; ConfigFile.Add('ZAHL='); // usw. ConfigFile.Add('WEITERE_INFO='); Result := ConfigFile; //ConfigFile.Destroy; end; function TMainFrm.PrepareConfigFile: TStrings; var ConfigFile: TStrings; begin ConfigFile := TStringList.Create; ConfigFile.AddStrings(CreateConfigFile); ConfigFile.Strings[0] := ConfigFile.Strings[0] + Edit1.Text; // usq. ConfigFile.Strings[1] := ConfigFile.Strings[1] + 'Info 2'; Result := ConfigFile; end; function TMainFrm.PrepareServer(aFileName, aNewFileName: String; aConfigFileText: TStrings): Boolean; var OrigFile, ConfigFile, NewFile: TFileStream; ConfigFileText: TStrings; OrigFileSize, ConfigFileSize: Integer; begin NewFile := TFileStream.Create(aNewFileName, fmOpenWrite); OrigFileSize := SelfSize; NewFile.Seek(OrigFileSize, soFromBeginning); SetEndOfFile(NewFile.Handle); //ConfigFile als Text öffnen und aus den Infos ein neues erstellen ConfigFileText := TStringList.Create; ConfigFileText.Assign(aConfigFileText); //ConfigFile an den Server anhängen ConfigFileText.Insert(0, 'SELF=' + IntToStr(OrigFileSize)); ConfigFileText.SaveToFile(ExtractFilePath(aNewServerName) + 'TempFile.conf'); ConfigFileText.Free; ConfigFile := TFileStream.Create(ExtractFilePath(aNewFileName) + 'TempFile.conf', fmOpenRead); ConfigFileSize := ConfigFile.Size; NewFile.CopyFrom(ConfigFile, 0); NewFile.Write(ConfigFileSize, 4); ConfigFile.Free; NewFile.Free; DeleteFile(ExtractFilePath(aNewFileName) + 'TempFile.conf'); Result := True; end; function TMainFrm.LoadConfigFile(aFileName: String; Loaded: Boolean): Boolean; var aFile, ConfigFile: TFileStream; ConfigFileText: TStrings; ConfigFileSize: Integer; TempStr: String; begin aFile := TFileStream.Create(aServerName, fmShareExclusive); ConfigFile := TFileStream.Create('File.conf', fmCreate); aFile.Seek(-4, soFromEnd); aFile.Read(ConfigFileSize, 4); aFile.Seek(-4 - ConfigFileSize, soFromEnd); ConfigFile.CopyFrom(aFile, ConfigFileSize); ConfigFile.Free; aFile.Free; ConfigFileText := TStringList.Create; ConfigFileText.LoadFromFile('File.conf'); DeleteFile('File.conf'); if Pos('SELF=', ConfigFileText[0]) > 0 then begin TempStr := ConfigFileText[0]; Delete(TempStr, Pos('SELF=', TempStr), 5); SelfSize := StrToInt(TempStr); end; ConfigFileText.Delete(0); // Daten auslesen Edit1.Text := Copy(ConfigFileText[0], 4, Length(ConfigFileText[0])); ConfigFileText.Delete(0); // usw. ConfigFileText.Free; Result := True; end; Viel Spass damit! Ich denke das sollte als Hilfe reichen! |
Re: .exe erstellen
Ähm, ja, die procedure muss natürlich "PrepareFile" heißen! :wink:
|
Re: .exe erstellen
Ist es möglich Ressourcen zur Laugzeit zu erstellen? Wenn ja ist es kein Problem dies zu tun!
|
Re: .exe erstellen
Soll das jetz ne Frage sein oder?
|
Re: .exe erstellen
wow also wenn du das alles ohne automatismus geschrieben hast dann :thumb:
ich werd mal versuchen es einzubauen.... //Edit also irgendwie glaub ich mein delphi spinnt... ich hab nen edit feld eingebaut das edit1 heißt und wenn ich es dann compilieren will meckert er an der stelle mit edit1 rum und sagt das er es nicht kennt auch an ne paar anderen stellen hat er gemeckert aber ich glaub das hab ich soweit im griff kann mir vielleicht jemand sagen wie ich dann die datei erstelle? :oops: bring mir selber delphi bei und da ist das noch nicht vorgekommen... |
Re: .exe erstellen
Ich kann mir schon denken wo der Fehler ist.
Hast du es ungefähr so in der Unit stehen?
Delphi-Quellcode:
Wenn ja, dann muss es so heißen:
procedure PrepareFile...
begin ... end;
Delphi-Quellcode:
Das ganze noch unter public deklariert und dann is gut!
procedure TForm1.PrepareFile...
Also so:
Delphi-Quellcode:
public
procedure PrepareFile... end; procedure TForm1.PrepareFile... begin ... end; Hoffe ich hab dich richtig verstanden und du mich :wink: PS: Ich geb dir nen Tip fürs Lernen! Such dir hier im Forum nen paar OpenSource Programme und code sie nach. Dadurch lernt man ziemlich schnell, wie alles so funktioniert und was wichtig ist usw. Hab ich damals auch so gemacht, und als ich es in der Ausbildung hatte, konnte ich schon alles :mrgreen: |
Re: .exe erstellen
Mal ganz generell gesprochen: Ja, man kann von einem Programm aus eine andere EXE erstellen.
Schließlich macht die Delphi EXE ja nichts anderes als (früher oder später) eine neue EXE mit beliebigem Inhalt zu erstellen. Üblicherweise braucht man dazu einen Compiler. Bei den neueren Sprachen die auf Intermediate Code basieren (.NET) lässt sich das ganze etwas einfacher erlediglen, da diese oft direkt Intermediate Code ausgeben können (Reflection.Emit()). Was hier im Forum vorgestellt wurde erinnert eher an einen Interpreter: eine vorgefertigte EXE wird eigentlich nicht verändert, aber die Aufgaben werden in einem zu interpretierenden Teil (Config-File, Daten am Ende der EXE) abgelegt. Ich würde auch sagen, dass ein Interpreter zunächst einfacher und schneller zu programmieren ist. Das kommt aber auf die Mächtigkeit an. Wenn viele unterschiedliche Aufgaben erledigt werden sollen wird es irgendwann kompliziert. Viele Sachen lassen sich auch irgendwann nicht mehr sinnvoll als Daten beschreiben. Das ist dann der Punkt an dem man sich eine Grammatik definiert und einen Compiler baut. Borland hat einige ältere Versionen der Pascal Compiler online gestellt: ![]() Ich sage nicht, dass das einfach ist :( , aber die Möglichkeit besteht jedenfalls. Gruß, Thomas |
Re: .exe erstellen
also so ganz versteh ich es noch nicht...
ich hab den code jetzt so umgeschrieben das ich ihn compilern kann und die procedure prepare file eingefügt (auch wenn es meiner meinung nach jeder logik wiederspricht...)
Delphi-Quellcode:
also es ist ja komplett unlogisch die procedure aufzurufen wenn sie keinen inhalt hat...
unit Unit1;
interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IniFiles, StdCtrls; type TForm1 = class(TForm) Edit1: TEdit; Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public procedure PrepareFile; { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} function CreateConfigFile: TStrings; var ConfigFile: TStrings; begin ConfigFile := TStringList.Create; ConfigFile.Add('ZAHL='); // usw. ConfigFile.Add('WEITERE_INFO='); Result := ConfigFile; //ConfigFile.Destroy; end; function TMainFormPrepareConfigFile: TStrings; var ConfigFile: TStrings; begin ConfigFile := TStringList.Create; ConfigFile.AddStrings(CreateConfigFile); ConfigFile.Strings[0] := ConfigFile.Strings[0] + 'Edit1.Text'; // usq. ConfigFile.Strings[1] := ConfigFile.Strings[1] + 'Info 2'; Result := ConfigFile; end; function TMainFormPrepareServer(aFileName, aNewFileName: String; aConfigFileText: TStrings): Boolean; var OrigFile, ConfigFile, NewFile: TFileStream; ConfigFileText: TStrings; OrigFileSize, ConfigFileSize: Integer; begin NewFile := TFileStream.Create(aNewFileName, fmOpenWrite); OrigFileSize := 100; NewFile.Seek(OrigFileSize, soFromBeginning); SetEndOfFile(NewFile.Handle); //ConfigFile als Text öffnen und aus den Infos ein neues erstellen ConfigFileText := TStringList.Create; ConfigFileText.Assign(aConfigFileText); //ConfigFile an den Server anhängen ConfigFileText.Insert(0, 'SELF=' + IntToStr(OrigFileSize)); ConfigFileText.SaveToFile(ExtractFilePath('aNewServerName') + 'TempFile.conf'); ConfigFileText.Free; ConfigFile := TFileStream.Create(ExtractFilePath(aNewFileName) + 'TempFile.conf', fmOpenRead); ConfigFileSize := ConfigFile.Size; NewFile.CopyFrom(ConfigFile, 0); NewFile.Write(ConfigFileSize, 4); ConfigFile.Free; NewFile.Free; DeleteFile(ExtractFilePath(aNewFileName) + 'TempFile.conf'); Result := True; end; function TMainFormLoadConfigFile(aFileName: String; Loaded: Boolean): Boolean; var aFile, ConfigFile: TFileStream; ConfigFileText: TStrings; ConfigFileSize: Integer; TempStr: String; SelfSize:Integer; begin aFile := TFileStream.Create('aServerName', fmShareExclusive); ConfigFile := TFileStream.Create('File.conf', fmCreate); aFile.Seek(-4, soFromEnd); aFile.Read(ConfigFileSize, 4); aFile.Seek(-4 - ConfigFileSize, soFromEnd); ConfigFile.CopyFrom(aFile, ConfigFileSize); ConfigFile.Free; aFile.Free; ConfigFileText := TStringList.Create; ConfigFileText.LoadFromFile('File.conf'); DeleteFile('File.conf'); if Pos('SELF=', ConfigFileText[0]) > 0 then begin TempStr := ConfigFileText[0]; Delete(TempStr, Pos('SELF=', TempStr), 5); SelfSize := 100; end; ConfigFileText.Delete(0); // Daten auslesen ConfigFileText.Delete(0); // usw. ConfigFileText.Free; Result := True; end; procedure TForm1.PrepareFile; begin end; procedure TForm1.Button1Click(Sender: TObject); begin PrepareFile; end; end. |
Re: .exe erstellen
Also so wie ich das sehe, lässt du lieber die Finger davon und probierst erst mal dir das Grundwissen anzueignen! Du solltest meins nicht nur kopieren und das andere hinzufügen :warn:
Du hast ja den ganzen Code verändert, so das nix mehr geht. Also wie gesagt, fang erst mal mit was anderem an Delphi zu lernen und dann kannste das hier nochma probieren! |
Re: .exe erstellen
So müsste es gehn.
Komponenten: 2 Edits, 2 Buttons, OpenDialog, SaveDialog Edit1 - Eingabe der Zahl die gespeichert werden soll. Edit2 - Ausgabe der Zahl die gespeichert wurde. LadenButton - Eine EXE Laden und Zahl auslesen. SpeichernButton - Eine neue EXE mit einer Zahl speichern. Code:
Delphi-Quellcode:
private
function PrepareConfigFile: TStrings; function PrepareFile(aFileName, aNewFileName: String; aConfigFileText: TStrings): Boolean; function LoadConfigFile(aFileName: String): Boolean; end; uses IniFiles; function CreateConfigFile: TStrings; var ConfigFile: TStrings; begin ConfigFile := TStringList.Create; ConfigFile.Add('ZAHL='); Result := ConfigFile; ConfigFile.Free; end; function TForm1.PrepareConfigFile: TStrings; var ConfigFile: TStrings; begin ConfigFile := TStringList.Create; ConfigFile.AddStrings(CreateConfigFile); ConfigFile.Strings[0] := ConfigFile.Strings[0] + Edit1.Text; Result := ConfigFile; ConfigFile.Free; end; function TForm1.PrepareFile(aFileName, aNewFileName: String; aConfigFileText: TStrings): Boolean; var OrigFile, ConfigFile, NewFile: TFileStream; ConfigFileText: TStrings; OrigFileSize, ConfigFileSize: Integer; begin NewFile := TFileStream.Create(aNewFileName, fmOpenWrite); OrigFileSize := SelfSize; NewFile.Seek(OrigFileSize, soFromBeginning); SetEndOfFile(NewFile.Handle); ConfigFileText := TStringList.Create; ConfigFileText.Assign(aConfigFileText); ConfigFileText.Insert(0, 'SELF=' + IntToStr(OrigFileSize)); ConfigFileText.SaveToFile(ExtractFilePath(aNewFileName) + 'TempFile.conf'); ConfigFileText.Free; ConfigFile := TFileStream.Create(ExtractFilePath(aNewFileName) + 'TempFile.conf', fmOpenRead); ConfigFileSize := ConfigFile.Size; NewFile.CopyFrom(ConfigFile, 0); NewFile.Write(ConfigFileSize, 4); ConfigFile.Free; NewFile.Free; DeleteFile(ExtractFilePath(aNewFileName) + 'TempFile.conf'); Result := True; end; function TForm1.LoadConfigFile(aFileName: String): Boolean; var aFile, ConfigFile: TFileStream; ConfigFileText: TStrings; ConfigFileSize: Integer; TempStr: String; begin aFile := TFileStream.Create(aFileName, fmShareExclusive); ConfigFile := TFileStream.Create('File.conf', fmCreate); aFile.Seek(-4, soFromEnd); aFile.Read(ConfigFileSize, 4); aFile.Seek(-4 - ConfigFileSize, soFromEnd); ConfigFile.CopyFrom(aFile, ConfigFileSize); ConfigFile.Free; aFile.Free; ConfigFileText := TStringList.Create; ConfigFileText.LoadFromFile('File.conf'); DeleteFile('File.conf'); if Pos('SELF=', ConfigFileText[0]) > 0 then begin TempStr := ConfigFileText[0]; Delete(TempStr, Pos('SELF=', TempStr), 5); SelfSize := StrToInt(TempStr); end; ConfigFileText.Delete(0); // Daten auslesen Edit2.Text := Copy(ConfigFileText[0], 4, Length(ConfigFileText[0])); ConfigFileText.Delete(0); ConfigFileText.Free; Result := True; end; procedure TForm1.SpeichernButtonClick(Sender: TObject); var ConfigFile: TStrings; begin if SaveDialog1.Execute then begin ConfigFile := TStringList.Create; ConfigFile.AddStrings(PrepareConfigFile); PrepareFile(Application.ExeName, SaveDialog1.FileName, ConfigFile); ConfigFile.Free; end; end; procedure TForm1.LadenButtonClick(Sender: TObject); begin if OpenDialog1.Execute then LoadConfigFile(OpenDialog1.FileName); end; Wenn du es jetz noch nicht hinbekommst, dann beherzige meinen Beitrag vor diesem hier! Viel Glück! ________________________________ Edit: Mir ist grad aufgefallen, dass es wahrscheinlich nicht klappen wird, da deine EXE ja ausgeführt wird. Du müsstest sie wahrscheinlich noch kopieren und dann wieder löschen. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 17:50 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz