Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Bilder aus Dll einbinden? (https://www.delphipraxis.net/154190-bilder-aus-dll-einbinden.html)

Lotus 31. Aug 2010 14:49

Delphi-Version: 2005

Bilder aus Dll einbinden?
 
Hallo, ich habe in der Codelibrary folgendes gefunden:
http://www.delphipraxis.net/3837-bil...-aufrufen.html

Doch das ganze funktioniert von hinten bis vorne bei mir nicht.

In dieser Zeile
Delphi-Quellcode:
r := TResourceStream.Create(h, 'BILD1', 'Jpeg');
kommt immer ein EResNotFound Fehler und ich weiß nicht wieso?
Könnt ihr mir helfen?
Könnte meine .dll vllt fehlerhaft sein? Wie kann ich das prüfen?

himitsu 31. Aug 2010 14:53

AW: Bilder aus Dll einbinden?
 
Ist h ein Handle zu deiner DLL?

Wie liegt das Bild in der DLL? (hoffentlich als Resource und die Resource ist auch erstellt und eingebunden)


Du kannst ja einfach mal mit einem RecourcenEditor in die DLL reinschauen, ob's auch da drin ist.


Eventuell auch statt "JPEG" es mal mit "RCDATA" versuchen.

DeddyH 31. Aug 2010 14:57

AW: Bilder aus Dll einbinden?
 
Bitte Crossposts künftig verlinken.

Bernhard Geyer 31. Aug 2010 15:13

AW: Bilder aus Dll einbinden?
 
Vermutlich geht es so:

Delphi-Quellcode:
r := TResourceStream.Create(h, 'RCDATA', 'BILD1');

DeddyH 31. Aug 2010 15:20

AW: Bilder aus Dll einbinden?
 
Laut Hilfe andersrum:
Zitat:

Delphi-Quellcode:
constructor Create(Instance: THandle; const ResName: string; ResType: PChar);


Bernhard Geyer 31. Aug 2010 15:35

AW: Bilder aus Dll einbinden?
 
Zitat:

Zitat von DeddyH (Beitrag 1046371)
Laut Hilfe andersrum:

Da hat mich wohl meine Glaskugel getäuscht :roll:

DeddyH 31. Aug 2010 15:37

AW: Bilder aus Dll einbinden?
 
:glaskugel: putzen ist dann wohl angesagt :mrgreen:

himitsu 31. Aug 2010 15:52

AW: Bilder aus Dll einbinden?
 
Soo, jetzt auch nochmal ich
Delphi-Quellcode:
r := TResourceStream.Create(h, 'BILD1', RT_RCDATA);
.

[pseudoedit]
ohhhhhh, jetzt hab'sch den DeddyH übersehn :lol:


Nja, wie gesagt, versuch es mal mit RCDATA.
"JPEG" ist nicht unbedingt eines der Standard-Resource-Formate, wie RCDATA/BMP/ICO/TEXT usw.

DeddyH 31. Aug 2010 16:19

AW: Bilder aus Dll einbinden?
 
Zitat:

Zitat von himitsu (Beitrag 1046376)
[pseudoedit]
ohhhhhh, jetzt hab'sch den DeddyH übersehn :lol:

*Grmpf* :evil:

Lotus 31. Aug 2010 19:21

AW: Bilder aus Dll einbinden?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von himitsu (Beitrag 1046361)
Ist h ein Handle zu deiner DLL?

Wie liegt das Bild in der DLL? (hoffentlich als Resource und die Resource ist auch erstellt und eingebunden)


Du kannst ja einfach mal mit einem RecourcenEditor in die DLL reinschauen, ob's auch da drin ist.


Eventuell auch statt "JPEG" es mal mit "RCDATA" versuchen.

h ist folgendes: var h :HINST;
Ich denke mal das es ein Handle ist, weiß es aber nicht genau.

Die Dll sieht so aus:
Delphi-Quellcode:
library Bilder;
{$R 'Bilder.res' 'Bilder.rc'}

begin
end.
und die Bilder.rc wie in dem Crosspost!

Leider kommt der selbe Fehler auch bei RCDATA :-/

Hab mal nen Screen vom Projektinspektor gemacht:
http://img818.imageshack.us/img818/3043/dll.jpg

Uploaded with ImageShack.us

himitsu 31. Aug 2010 19:30

AW: Bilder aus Dll einbinden?
 
Zitat:

Zitat von Lotus (Beitrag 1046468)
h ist folgendes: var h :HINST;

Ich fragte nicht nach der Deklaration (diese hattest du sowieso schon gepostet),
sondern nach dem Wert, welcher in dieser Variable steckt.
(dieser wird meistens über MSDN-Library durchsuchenLoadLibrary oder MSDN-Library durchsuchenGetModuleHandle besorgt)

Es wäre nicht schlecht, wenn du mal die ganze Prozedur zeigen würdest, wo du das Bild auslesen willst (bzw. zumindestestens alle wichtigen Teile).

Lotus 31. Aug 2010 23:07

AW: Bilder aus Dll einbinden?
 
Also das steht in meinem Projekt, wo ich die Bilder benutzen möchte:

Delphi-Quellcode:
procedure images();
var
  h :HINST;
  r :TResourceStream;
  j :TJpegImage;
  i :integer;
begin
  h := LoadLibrary('Bilder.dll');
  if h <> 0 then begin
    r := TResourceStream.Create(h, 'BILD1', RT_RCDATA);
    j := TJpegImage.Create;
      try
        j.LoadFromStream(r);
        Form1.Image1.Picture.Bitmap.Assign(j);
      finally
        j.Free;
        r.Free;
      end;
  FreeLibrary(h);
end
  else
    RaiseLastOSError();
end;

Luckie 31. Aug 2010 23:14

AW: Bilder aus Dll einbinden?
 
Zwei Punkte:
1. Gib mal einen absoluten Pfad zur DLL an.
2. Bau mal einen try-except-Block um LoadFromStream, damit du eine aussagekräftige Fehlermeldung bekommst.

Hast du mal in die DLL reingeguckt, ob die Ressourcen wirklich drin sind?

Lotus 31. Aug 2010 23:19

AW: Bilder aus Dll einbinden?
 
Hi,

bin noch nicht lange mit Delphi dabei, welche Exception soll ich dann genau abfangen? Für nen kleinen Codeschnippsel oder Link wäre ich sehr dankbar.

Edit:
Absoluter Pfad zur DLL bringt leider nichts.

Luckie 1. Sep 2010 11:16

AW: Bilder aus Dll einbinden?
 
Keine spezielle. Du sollst einfach nur eine aussagekräftige Fehlermeldung bekommen.

Und hast du dir endlich mal die DLL mit einem Ressourceneditor angeguckt?

DataCool 1. Sep 2010 11:21

AW: Bilder aus Dll einbinden?
 
Hi,

probier bitte mal das :

Delphi-Quellcode:
// Form1.Image1.Picture.Bitmap.Assign(j);
  Form1.Image1.Picture.Assign(j);
Greetz Data

Lotus 1. Sep 2010 11:56

AW: Bilder aus Dll einbinden?
 
Wo finde ich den Ressourceneditor?

Um loadfromstream ist ja schon ne try Klausel.. bis dahin komme ich aber gar nicht.. der Fehler beginnt ja beim TResourceStream...

In der Delphi-Hilfe habe ich auch nichts zu einem RessourcenEditor gefunden.. kann es sein das ihr den hier meint:
http://www.wilsonc.demon.co.uk/d10resourceeditor.htm
?

@DataCool

Ich habs mal geändert, aber wie gesagt, bis dahin kommt das Programm leider gar nicht erst..

Luckie 1. Sep 2010 12:03

AW: Bilder aus Dll einbinden?
 
Bei Google suchenRessourceneditor

Aber kein Try-Except-Block.

Lotus 1. Sep 2010 12:14

AW: Bilder aus Dll einbinden?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Okay hab mal nen Except drum gebaut, aber wie gesagt, soweit kommt das Programm ja noch nicht..

Hab die DLL mir jetzt mit Resource Hacker angeschaut.. aber was ich da finden soll weiß ich auch nicht so recht... Bild im Anhang

Luckie 1. Sep 2010 12:19

AW: Bilder aus Dll einbinden?
 
Zitat:

Zitat von Lotus (Beitrag 1046657)
Hab die DLL mir jetzt mit Resource Hacker angeschaut.. aber was ich da finden soll weiß ich auch nicht so recht...

Eventuell die eingebundenen Bilder? :roll: Und siehst du sie?

Lotus 1. Sep 2010 12:29

AW: Bilder aus Dll einbinden?
 
Nein.

Ich seh da so gut wie gar nichts sinnvolles in der Datei...

Ich habe die DLL aber exakt nach Anleitung erstellt.. hier meine vorgehensweise:

Datei - Neu - "DLL-Experte"

Diese habe ich in einem Verzeichnis ("Bilder") gespeichert.
In diesem Ordner befinden sich meine Bilder mit den Namen:
h3.jpg
h5.jpg
hk.jpg

Weiterhin ist in dieser eine Bilder.rc Datei, welche folgenden Inhalt besitzt:
BILD1 JPEG "h3.jpg"
BILD2 JPEG "h5.jpg"
BILD3 JPEG "hk.jpg"

Nun bin ich in Delphi auf Projektverwaltung und habe dort unter Bilder.dll rechtsklick, hinzufügen gemacht und die Bilder.rc Datei ausgewählt.

Dann hat Delphi automatisch den Code angepasst zu:
Delphi-Quellcode:
library Bilder;


{$R 'Bilder.res' 'Bilder.rc'}

uses
  SysUtils,
  Classes;


begin
end.
Dann habe ich das Projekt erstellt mit Strg+F9.. Die DLL wurde erzeugt und diese habe ich dann in das Verzeichnis meines eigentlichen Projekts kopiert.

Ist das falsch gewesen?

himitsu 1. Sep 2010 12:33

AW: Bilder aus Dll einbinden?
 
Delphi 2005 kompiliert die RC-Dateien nicht automatisch (glaub ich).
Das müßtest du also selber machen.

DeddyH 1. Sep 2010 12:37

AW: Bilder aus Dll einbinden?
 
Und ob STRG-F9 da reicht, weiß ich nicht so genau, hast Du es mal mit SHIFT-F9 probiert?

Lotus 1. Sep 2010 12:41

AW: Bilder aus Dll einbinden?
 
Ich benutze Delphi 7... habe bei der Bilder.rc jetzt mal Bilder erzeugen gemacht.. hat sich aber nichts geändert.. die Dll hab ich erneut erzeugt, aber auch diesmal findet er die Ressource nicht...

Shift-F9 bringt gar nichts.. oO was soll denn da passieren?

DeddyH 1. Sep 2010 12:44

AW: Bilder aus Dll einbinden?
 
Um aus der *.rc eine *.res zu machen, brauchst Du IIRC die brcc32.exe. Das ist ein Kommandozeilenprogramm, das im Normalfall mit Delphi installiert wird (müsste also im Delphi-bin-Verzeichnis liegen).

Luckie 1. Sep 2010 12:45

AW: Bilder aus Dll einbinden?
 
Zitat:

Zitat von Lotus (Beitrag 1046665)
Nein.

Wie viele Seiten Postings hätte uns diese Erkenntnis jetzt gespart, wenn du das gleich zu Anfang mal kontrolliert hättest, wie man es dir schon im zweiten Posting vorgeschlagen hat?

Zitat:

Ich seh da so gut wie gar nichts sinnvolles in der Datei...
Lösche mal Units aus der Uses-Klausel, die brauchst du nicht, dann hast du auch nicht die ganzen anderen Ressourcen in der DLL.

Lotus 1. Sep 2010 12:57

AW: Bilder aus Dll einbinden?
 
So, das sieht jetzt alles schon ein bisschen besser aus!
Habe jetzt die .rc mit brcc32 in eine *.res umgewandelt!
Diese Datei ist jetzt ca so groß wie die Bilder zusammen.. dürfte also stimmen.. dann habe ich das ganze erneut mit Delphi in eine dll umgewandelt.. diese ist sogar noch ein bisschen größer.. (149Kb)
Mit dem Resourcenhacker habe ich in die DLL geschaut und nun gibts da auch nen Ordner JPEG mit BILD1, BILD2 und BILD3, allerdings sehe ich keine Bilder, sondern lediglich Hexadezimalcode (sollte auch richtig sein denke ich :D)

Aber trotz allem findet er noch immer keine Ressource Bild1


So Leute, das wars!!!

Hab die Zeile zu:
Delphi-Quellcode:
r := TResourceStream.Create(h, 'BILD1', 'JPEG');
geändert und das Bild wird eingefügt!

Für alle die in Zukunft nochmal auf dieses Thema stoßen, hier der komplette Quelltext:
Delphi-Quellcode:
procedure images();
var
  h :HINST;
  r :TResourceStream;
  j :TJpegImage;
begin
  h := LoadLibrary('F:\Programme\Borland\Delphi7\Projects\Poker\bilder.dll');
  if h <> 0 then begin
    r := TResourceStream.Create(h, 'BILD1', 'JPEG');
    j := TJpegImage.Create;
      try
        j.LoadFromStream(r);
       Form1.Image1.Picture.Assign(j);
      finally
             j.Free;
            r.Free;
      end;

  FreeLibrary(h);
end
  else
    RaiseLastOSError();
end;

himitsu 1. Sep 2010 13:00

AW: Bilder aus Dll einbinden?
 
OK, im Ausgangspost steht halt was von Delphi 2005.
(der Admin muß das endlich mal ändern)

PS: Trag doch einfach mal deine Delphi-Version in dein DP-Profil ein.

Gut, Delphi 7 kompiliert erst rechte keine RC-Dateien von sich aus.
Du mußt also erstmal aus der RC eine RES erstellen (siehe Post #25), welche du dann in deine DLL einbinden kannst.

Lotus 1. Sep 2010 13:03

AW: Bilder aus Dll einbinden?
 
Jup, das war auch der Fehler, dankeschön!

Lotus 1. Sep 2010 16:19

AW: Bilder aus Dll einbinden?
 
Sorry für den Doppelpost, aber ich hätte da noch eine Frage:
Kann ich die Bilder auch am Anfang einmal einlesen und dann die ganze Zeit nutzen? Geht das irgendwie? Mit diesem Handle und Stream siehts recht komplex aus.. geht das?

Progman 1. Sep 2010 17:11

AW: Bilder aus Dll einbinden?
 
TJPEGImage(s) über Create erzeugen und in diese(s) einlesen. Die können dann per Assign (z.B.) dahin zugewiesen werden, wo sie gebraucht werden. Nur nicht vergessen, bei Ende des Programms (MainForm.Destroy) alle wieder freizugeben.

Lotus 1. Sep 2010 18:30

AW: Bilder aus Dll einbinden?
 
Das heißt aber, dass ich bei 72 Bilder auch 72 globale Variablen definieren muss? Das ist ja nicht sehr effektiv, da versuch ich mir was anderes auszudenken!

Luckie 1. Sep 2010 18:36

AW: Bilder aus Dll einbinden?
 
Nimm ein Array.

Progman 1. Sep 2010 18:43

AW: Bilder aus Dll einbinden?
 
Array of TJpegImage müsste doch gehen?
Allerdings müsste man dann immer wissen, an welcher Position welches Bild ist ;-)
Aber wenn man in der rc-Datei die Bilder nach Nummerierung benennt (BILD00, BILD01...BILD71) könnte man das auf einen Ritt in einer For-Schleife einlesen, da die Bildnamen mit Hilfe der Laufvariablen erzeugt werden können. Und aus dem Namen ergäbe sich auch die Positon im Array (zur Orientierung).

himitsu 1. Sep 2010 18:45

AW: Bilder aus Dll einbinden?
 
Du könntest die ResourceStreams auch schon alle erstellen, soviel Speicher brauchen diese Streams selber garnicht und brauchst dann nur noch jedesmal ein Position=0 und ein LoadFromStream zu machen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz