Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   TImage Bild laden über DLL (https://www.delphipraxis.net/180560-timage-bild-laden-ueber-dll.html)

Luki206 29. Mai 2014 15:01

TImage Bild laden über DLL
 
Hi DP, ich habe ein Problem/Frage, ich habe jetzt etwas versucht ein Bild aus einer DLL über eine DLL zu laden sprich ich habe den Code in der DLL:
Delphi-Quellcode:
procedure GetImage(Image: TImage; place: Integer; SLibrary: String); stdcall;
var
myStream: TResourceStream;
h: Cardinal;
LGraphic: TGraphic;
begin
 h:= LoadLibrary(PChar(SLibrary));
 mystream := TResourceStream.CreateFromID(h, place, RT_RCDATA);
 LGraphic := TPngImage.Create;
  try
    LGraphic.LoadFromStream(mystream);
    Image.Picture.Assign(LGraphic);
  finally
    mystream.Free;
    LGraphic.Free;
  end;
 FreeLibrary(h);
end;
Und rufe ihn so auf (DLL wird zum Ladezeit punkt eingebunden):
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
 GetImage(ImgTest, 1, 'Test.dll');
end;
Das Bild ist ein PNG Bild.

Und jetzt meine Frage, ich bekomme beim Starten folgenden Fehler:
Code:
Im Projekt Test.exe ist eine Exception der Klasse EConvertError mit der Meldung 'TPngImage kann nicht zu TPicture zugewiesen werden' aufgetreten.
Danke Luki :spin:

Bernhard Geyer 29. Mai 2014 15:18

AW: TImage Bild laden über DLL
 
Wenn du die DLL nicht als Package umbaust (als gemeinsame Runtimepackages) geht das nicht.

Jede DLL hat eine eigene "Implementierung" allen Klassen "on Board" so das Exe.TObject <> Dll.TObject (und auch für alle anderen Klassen) gilt.

Was willst du eigentlich erreichen wenn du die Funktionalität in eine DLL verlagerst?

Union 29. Mai 2014 15:21

AW: TImage Bild laden über DLL
 
Du weist direkt zu. Du musst über die Bitmap-Eigenschaft gehen.

Perlsau 29. Mai 2014 15:23

AW: TImage Bild laden über DLL
 
Zitat:

Zitat von Luki206 (Beitrag 1260672)
Und jetzt meine Frage, ich bekomme beim Starten folgenden Fehler:
Code:
Im Projekt Test.exe ist eine Exception der Klasse EConvertError mit der Meldung 'TPngImage kann nicht zu TPicture zugewiesen werden' aufgetreten.

Ich sehe da keine Frage, sondern lediglich eine Fehlermeldung, die besagt, daß du ein TPngImage-Objekt nicht einem TPicture-Objekt zuweisen kannst.

himitsu 29. Mai 2014 15:24

AW: TImage Bild laden über DLL
 
Zitat:

Zitat von Perlsau (Beitrag 1260677)
Ich sehe da keine Frage, sondern lediglich eine Fehlermeldung, die besagt, daß du ein TPngImage-Objekt nicht einem TPicture-Objekt zuweisen kannst.

Jupp, das außerdem.
TPngImage ist ein TGraphic und TImage ist das nicht. (TImage kapselt nur ein TPicture, wo ein TGraphic drin ist)


Zitat:

Zitat von Luki206 (Beitrag 1260672)
sprich ich habe den Code in der DLL

Und dann wunderst du dich, daß es nicht funktioniert?

Objekte, Strings, dynamische Arrays usw. DARF man nicht über DLL-Genzen hinweg verwenden.

Stichwort: Memory und RTTI

Da hat jede DLL/EXE ihre eigenen Speichermanager und auch eine eigene RTTI, womit das nicht kompatibel zueinander ist.
Außer man verbindet diese Dinge: z.B. den Speicher via SharedMemory (gibt es mehrere Wege dafür) oder die RTTI über Packages (BPL).

Und dann gibt es auch noch globale und gemeinsam genutzt Objekte, die du hier gemeinsam nutzen illst, obwohl sie eben nicht gemeinsam für DLL/EXE genutzt werden können.


Zitat:

Und jetzt meine Frage, ich bekomme beim Starten folgenden Fehler:
PS: Es gibt einen Unterschied zwischen Compilieren und dem Starten des Programms.

Bernhard Geyer 29. Mai 2014 15:47

AW: TImage Bild laden über DLL
 
[QUOTE=himitsu;1260678]
Zitat:

Zitat von Perlsau (Beitrag 1260677)
Ich sehe da keine Frage, sondern lediglich eine Fehlermeldung, die besagt, daß du ein TPngImage-Objekt nicht einem TPicture-Objekt zuweisen kannst.

Jupp, das außerdem.
TPngImage ist ein TGraphic und TImage ist das nicht. (TImage kapselt nur ein TPicture, wo ein TGraphic drin ist)

Und wie schaut der Quellcode aus? Image.Picture.Assign(LGraphic)? Also wir ja dem Picture-Object das PNG zugewiesen.

himitsu 29. Mai 2014 16:43

AW: TImage Bild laden über DLL
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1260682)
Und wie schaut der Quellcode aus? Image.Picture.Assign(LGraphic)? Also wir ja dem Picture-Object das PNG zugewiesen.

Delphi-Quellcode:
GetImage(ImgTest, 1, 'Test.dll');
Ich möchte fast wetten, daß ImgTest das PNGImage ist.


Wenn der GetImage-Code in die EXE rein kommt, dann kann er dort auch problemlos verwendet werden.
Und wenn man entweder den passenden Typ übergbit, anstatt des ImgTest,
oder wenn man den Parametertyp entpsrechend anpasst, dann ist das Problem auch weg.


Und den Resourcenschutzblock sollte man auch reparieren, denn wenn es beim Laden der Resource oder beim Laden des Bildes knallt, dann wird die DLL nicht mehr freigegeben.

Luki206 8. Jun 2014 17:15

AW: TImage Bild laden über DLL
 
Sorry das ich mich erst jetzt melde... Wie dämlich bin ich denn :wall: Wem es nicht aufgefallen ist, ich habe die Frage schon einmal in einer anderen Form gefragt.. Ich entschuldige mich dafür noch einmal...


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:55 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 by Thomas Breitkreuz