Autor Beitrag
toenne
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Mo 11.01.10 23:12 
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: Mo 11.01.10 23:14 
dazu bräuchtest du einen compiler ;) wenn du den hast dann könnte es gehen.

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
Xentar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2077
Erhaltene Danke: 2

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mo 11.01.10 23:18 
Warum nicht einfach das Bild als *.bmp Datei mitgeben, sondern unbedingt als Resource?

_________________
PROGRAMMER: A device for converting coffee into software.
toenne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 3747
Erhaltene Danke: 123

Windows Vista, Ubuntu
Delphi 7 PE "Codename: Aurora", Eclipse Ganymede
BeitragVerfasst: 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.

_________________
This Signature-Space is intentionally left blank.
Bei Beschwerden, bitte den Beschwerdebutton (gekennzeichnet mit PN) verwenden.
toenne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



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

Win XP
Delphi 5 Ent., Delphi 2007 Prof
BeitragVerfasst: Mo 11.01.10 23:43 
Wird aber nur bei dir lokal klappen, weil die dcc32 ein Bestandteil von Delphi ist.

_________________
PROGRAMMER: A device for converting coffee into software.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
toenne Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10183
Erhaltene Danke: 1256

W10ent
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mo 11.01.10 23:55 
Moin!

Hatte user profile iconjaenicke nicht mal mit einer MS-API experimentiert, die Resourcen austauschen/bearbeiten konnte? :gruebel: Kann den Fred nur grad nicht finden... :?

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
BenBE
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 8721
Erhaltene Danke: 191

Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
BeitragVerfasst: 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.

_________________
Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19326
Erhaltene Danke: 1749

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Di 12.01.10 01:16 
user profile iconNarses hat folgendes geschrieben Zum zitierten Posting springen:
Hatte user profile iconjaenicke 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 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 51



BeitragVerfasst: Di 12.01.10 10:44 
So, funktioniert schonmal soweit - besten Dank für den Tip mit dem Kommandozeilen-Compiler! :)
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:
  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;');
  // Hier steht als Caption die Zeile {$R 'Lizenz.res','Lizenz.rc'} drin,
  // das Label selbst ist unsichtbar und stört so nicht...war so das einfachste ;-)
  Writeln(Text_Datei, label1.caption );
  Writeln(Text_Datei, 'begin');
  Writeln(Text_Datei, 'end.');
  CloseFile(Text_Datei);
  
  // Recourcendatei erstellen
  ShellExecute(0,
               'open',
               'C:\delphi\Bin\BRCC32.EXE',
               'C:\delphi\test.rc',
               nil,
               SW_NORMAL);
  // DLL erzeugen
  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