![]() |
Programm Build - dynamisch erzeugen
Hallo,
ich möchte während der Laufzeit ein Programm dynamisch erzeugen lassen. Einfaches Beispiel: - Programm A enthält ein Edit-Feld (Edit1) und einen Button. - Beim Klicken auf den Button wird ein ausführbares Programm B erzeugt, dass ein Label hat, dess Caption die von Edit1.Text ist. Es würde mich sehr freuen, wenn mir jemand helfen könnte, auch wenn es nur ein Ansatz ist. Übrigens soll das Programm A überall laufen, auch wo keine IDE installiert ist, d.h. es darf nicht eine eigene make.exe von freepascal/delphi/... brauchen. Vielen Dank |
AW: Programm Build - dynamisch erzeugen
Zitat:
|
AW: Programm Build - dynamisch erzeugen
Könntest du dir eine von beiden Möglichkeiten als realisierbar vorstellen ?
|
AW: Programm Build - dynamisch erzeugen
Sie sind beide realisierbar. Einfacher wäre es allerdings, einfach den FPC und die LCL-Sourcen mitzuliefern.
|
AW: Programm Build - dynamisch erzeugen
Mal abgesehen davon, daß das sicher realisierbar ist (Delphi selbst ist ja im Grunde auch nichts anderes), stellt sich die Frage, ob man es so realisieren sollte.
Ich gehe zwar davon aus, daß dein Beispiel mit dem Label nur fiktiv ist, aber das könnte man mit einer fertig compilierten EXE, die eine Konfigurationsdatei liest, wesentlich einfacher und schneller hinkriegen. Beschreib doch einfach mal, was du wirklich machen willst. |
AW: Programm Build - dynamisch erzeugen
Schuss ins Blaue: Liefere eine Vorlage für die zu erzeugende Exe mit, kopiere sie auf Knopfdruck und bette den String mit
![]() |
AW: Programm Build - dynamisch erzeugen
Die Frage ist viel eher, was will er damit erreichen. Man kann sein jetztiges Vorhaben auch ganz einfach lösen, indem man einfach Daten/Flags hinten an die Kopie der Exe dran macht und bei jedem Start prüft, ob was da ist und darauf reagiert...
Aber in was für einem Ausmaß der das braucht und wie komplex das dann wird, ist für mich ungewiss! |
AW: Programm Build - dynamisch erzeugen
Eine echte Ressource braucht man dafür gar nicht:
![]() |
AW: Programm Build - dynamisch erzeugen
Vielen Dank für die zahlreichen Antworten :)
Einen konkreten Anwendungsfall habe ich nicht, dies war eher eine theoretische Frage. Meistens suche ich mir zuerst die Lösung, dann das Problem, es wird sicherlich eines kommen, in dem ich dies anwenden kann. Die Idee von uligerhardt halte ich für sehr treffend. Leider ist UpdateResource neu für mich, daher muss ich mich damit zunächst beschäftigen. Übrigens müsste man gar keine Kopie von Programm B mitliefern, da ich Programm B als Ressource in mein Programm A einbauen kann. Beim Button-Klick wird die Ressource extrahiert und dann im Programm B mit UpdateRessource der String / die Strings ersetzt. Desweiteren hoffe ich, dass ich aus dem String ABC auch wxyz machen kann, also unterschiedliche Zeichenlänge, was mit einem "normalen" Hexeditor nicht geht :( Gruß, Thomas |
AW: Programm Build - dynamisch erzeugen
Zitat:
Du kannst in der Demo in einem Memo Text eingeben und anhängen, beim nächsten Start ist der dann beim Start im Memo. Da du mit Lazarus arbeitest, wäre UpdateResource wohl weniger sinnvoll, da es eine Windows API Funktion ist. Und Lazarus ist ja vor allem für Cross Plattform sinnvoll, was dann damit nicht mehr ginge. Meine Lösung macht das selbst. |
AW: Programm Build - dynamisch erzeugen
Diese Lösung scheint mir doch die einfachste.
Soweit ich es getestet habe, schein es auch zu funktionieren. Danke für den Link. |
AW: Programm Build - dynamisch erzeugen
Nun wollte ich die andere Möglichkeit mit UpdateResource noch ausprobieren.
Wie man damit eine Resource in einer exe-Datei ändert habe ich schon herausgefunden. Wie / wo kann ich diese Resource erstellen, die in dem zu ändernden Programm enthalten sind ? Edit: Jetzt weiß ich nicht wo der Fehler steckt. Ich habe eine Resource in Programm B per lrs-file eingebunden. Diese kann ich im Programm B selber abfragen:
Delphi-Quellcode:
(Die Resource heißt text)
LazarusResources.Find('text').Value;
Ich hoffte, diese mit Programm A ändern zu können, hier mein Code:
Delphi-Quellcode:
folgende Parameter verwende ich:
function SetRes(filename, resname, resvalue: string): boolean;
var hUpdate: THandle; Size: DWord; begin hUpdate := BeginUpdateResource(PChar(filename), True); if (hUpdate <> 0) and (hUpdate <> INVALID_HANDLE_VALUE) then begin try Size := Succ(Length(resvalue)) * SizeOf(char); Result := UpdateResource(hUpdate, RT_RCDATA, PChar(resname), 0, PChar(resvalue), Size); finally EndUpdateResource(hUpdate, False); end; end; end; Syntax:
Delphi-Quellcode:
Der einzige Unterschied, den ich in B festmachen kann, ist, dass das Design anders ist; ein Button wird nicht mehr blau sondern eher gräulich ist, es erinnert an win98(?).
SetRes('ProgrammB.exe','text','Ein Test...')
Edit^2: habe den namen auch mal von "text" umbenannt, aber es funktioniert nicht! Vielen Dank |
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:37 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