![]() |
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:
Und rufe ihn so auf (DLL wird zum Ladezeit punkt eingebunden):
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;
Delphi-Quellcode:
Das Bild ist ein PNG Bild.
procedure TForm1.FormCreate(Sender: TObject);
begin GetImage(ImgTest, 1, 'Test.dll'); end; Und jetzt meine Frage, ich bekomme beim Starten folgenden Fehler:
Code:
Danke Luki :spin:
Im Projekt Test.exe ist eine Exception der Klasse EConvertError mit der Meldung 'TPngImage kann nicht zu TPicture zugewiesen werden' aufgetreten.
|
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? |
AW: TImage Bild laden über DLL
Du weist direkt zu. Du musst über die Bitmap-Eigenschaft gehen.
|
AW: TImage Bild laden über DLL
Zitat:
|
AW: TImage Bild laden über DLL
Zitat:
TPngImage ist ein TGraphic und TImage ist das nicht. (TImage kapselt nur ein TPicture, wo ein TGraphic drin ist) Zitat:
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:
|
AW: TImage Bild laden über DLL
[QUOTE=himitsu;1260678]
Zitat:
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. |
AW: TImage Bild laden über DLL
Zitat:
Delphi-Quellcode:
Ich möchte fast wetten, daß ImgTest das PNGImage ist.
GetImage(ImgTest, 1, 'Test.dll');
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. |
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