Entwickler-Ecke
Dateizugriff - Delphi: DLL aus Anwendung heraus erstellen
toenne - Mo 11.01.10 23:12
Titel: Delphi: DLL aus Anwendung heraus erstellen
Mal wieder eine blöde Frage: Besteht die Möglichkeit aus einer Anwendung heraus zur Laufzeit eine DLL zu erstellen?
Hintergrund: Bislang habe ich mit einem externen Programm ein BMP erstellt. Dann habe ich eine test.rc mit dem Inhalt...
Zitat: |
BILD1 BITMAP "test.bmp" |
...erstellt und das ganze in Delphi 7 so kompiliert:
Zitat: |
library Bild;
{$R 'test.res' 'test.rc'}
begin
end.
|
In der eigentlichen Zielapplikation wird das Bild dann mittels...
Zitat: |
BildDatei := LoadLibrary('Bild.dll');
Bitmap.LoadFromResourceName(BildDatei, 'BILD1');
|
...geladen.
Ich weiss, klingt grauenhaft umständlich :D . Hat aber seinen Sinn, müsst ihr mir jetzt einfach mal glauben ;).
Jetzt ist es so dass ich das BMP direkt in einer mittels Delphi geschriebenen Anwendung erzeuge, da wäre es natürlich eine erhebliche Vereinfachung wenn ich dann aus dieser Anwendung heraus auch gleich die DLL erstellen könnte.
Irgendeine Idee dazu?
Schöne Grüsse
Toenne
elundril - Mo 11.01.10 23:14
dazu bräuchtest du einen compiler ;) wenn du den hast dann könnte es gehen.
Xentar - Mo 11.01.10 23:18
Warum nicht einfach das Bild als *.bmp Datei mitgeben, sondern unbedingt als Resource?
toenne - Mo 11.01.10 23:30
Hat seinen Sinn, glaubs mir einfach ;).
Zitat: |
dazu bräuchtest du einen compiler ;) wenn du den hast dann könnte es gehen. |
Öhem...könntest du das etwas präzisieren? Stehe leider gerade etwas auf dem Schlauch wie du das meinst - evtl. einen externen Compiler mit den entsprechenden Parametern aus der Anwendung heraus starten? Bringt Delphi einen solchen mit (bislang habe ich nur mit der GUI gearbeitet *schäm*)? Wäre dann nämlich eine durchaus genehme Lösung.
Wie müsste das dann bei obigen Beispiel lauten?
Gruss
Toenne
elundril - Mo 11.01.10 23:41
dann bräuchst du auf jedem rechner auf dem du die DLL erzeugen willst eine installierte Delphi-Version mit mind. Professional.
aber zusätzlich zu dem Compiler (da könntest du ja theoretisch den von devcpp nehmen) bräuchtest du einen Ressourcencompiler. Wo du den herbekommst hab ich keine ahnung. am besten wäre es glaub ich wenn du dir überlegst ob du nicht doch irgendwie eine andere möglichkeit findest.
toenne - Mo 11.01.10 23:41
Ich glaube (hoffe?) ich habs schon:
- Das BMP erstellen und speichern (das wird archiviert, brauche ich also ohnehin als Datei)
- Ein ASCII-File mit ' BILD1 BITMAP "test.bmp" ' als Inhalt unter 'Test.rc' speichern
- Ein ASCII-File mit ' library Bild; ...usw... ' als Bild.dpr speichern
- Dann ' ShellExecute(0, 'open', 'dcc32 Bild', nil, nil, SW_NORMAL); ' ausführen
- Zu guter letzt die beiden obigen ASCII-Files wieder löschen.
Korrekt?
Gruss
Toenne
Edit:
Hat sich überschnitten ;).
Das ganze muss nicht portierbar auf andere Rechner sein, selbst die Pfade können fix sein.
Xentar - Mo 11.01.10 23:43
Wird aber nur bei dir lokal klappen, weil die dcc32 ein Bestandteil von Delphi ist.
BenBE - Mo 11.01.10 23:44
Wenn in der DLL kein Code angepasst werden muss, kannst du auch einfach die DLL ohne Resourcen dir merken und dann das Resourcen-Verzeichnis der DLL im Speicher patchen, bevor Du deren Image auf Platte schreibst. Dabei gibt es zwar eine Reihe von Dingen zu beachten, aber Grundlegend dürfte es damit erstmal gehen.
toenne - Mo 11.01.10 23:52
@Xentar
Das macht nix, ist wirklich nur als Erleichterung für diesen Arbeitsplatz gedacht.
@Benny
Der Code müsste nur dahingehend angepasst werden dass der BMP-Name variiert. Aber da könnte man ja zweigleisig fahren, also einen Dummy mit immer gleichem Namen für die DLL erzeugen und eine Kopie davon als eigentliche BMP fürs Archiv.
Den Rest von dem was zu geschrieben hast habe ich aber nicht im Ansatz kapiert, muss ich erstmal verdauen :D :D.
Gruss
Toenne
Narses - Mo 11.01.10 23:55
Moin!
Hatte
jaenicke nicht mal mit einer MS-API experimentiert, die Resourcen austauschen/bearbeiten konnte? :gruebel: Kann den Fred nur grad nicht finden... :?
cu
Narses
BenBE - Di 12.01.10 00:36
Es gab glaube mal für ne etwas ältere Version von Delphi n Demo, wo ein kleiner Resourcen-Viewer implementiert war. Mit etwas Arbeit lässt sich daraus durchaus das Konzept erkennen und mit den benötigten Strukturen auch ein Writer bauen.
Das Template der DLL kann dabei gleich sein, weil du das gesamte Resource Directory dynamisch schreiben lassen kannst.
jaenicke - Di 12.01.10 01:16
Narses hat folgendes geschrieben : |
Hatte jaenicke nicht mal mit einer MS-API experimentiert, die Resourcen austauschen/bearbeiten konnte? :gruebel: Kann den Fred nur grad nicht finden... :? |
Ich weiß die Befehle aber noch: :mrgreen:
UpdateResource [
http://msdn.microsoft.com/en-us/library/ms648049.aspx] zum Beispiel
Das sollte mit DLLs genauso wie mit EXE-Dateien gehen, da beide im PE-Format vorliegen. Ausprobiert habe ich es mit DLLs aber nicht.
toenne - Di 12.01.10 10:44
So, funktioniert schonmal soweit - besten Dank für den Tip mit dem Kommandozeilen-Compiler! :)
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:
| BMPname := 'C:\delphi\test.bmp'; SavePictureDialog1.FileName := BMPname; if SavePictureDialog1.Execute then BMPname:=SavePictureDialog1.FileName; Image.Picture.Bitmap.SaveToFile(BMPname);
AssignFile (Text_Datei, 'C:\delphi\test.rc'); Rewrite(Text_Datei); Writeln(Text_Datei, 'BILD1 BITMAP "' + BMPName + '"'); CloseFile(Text_Datei);
AssignFile (Text_Datei, 'C:\delphi\test.dpr'); Rewrite(Text_Datei); Writeln(Text_Datei, 'library Bild;'); Writeln(Text_Datei, label1.caption ); Writeln(Text_Datei, 'begin'); Writeln(Text_Datei, 'end.'); CloseFile(Text_Datei); ShellExecute(0, 'open', 'C:\delphi\Bin\BRCC32.EXE', 'C:\delphi\test.rc', nil, SW_NORMAL); ShellExecute(0, 'open', 'C:\delphi\Bin\DCC32.EXE', 'C:\delphi\test.dpr', nil, SW_NORMAL); |
Die DLL wird brav erzeugt und funktioniert auch - prima!
Schöne Grüsse und nochmals vielen Dank für die Denkanstösse
Toenne
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!