Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Problem beim Umgang mit DLL's (https://www.delphipraxis.net/154117-problem-beim-umgang-mit-dlls.html)

Hannes91 28. Aug 2010 13:18

Problem beim Umgang mit DLL's
 
Moin,

ich bin gerade dabei, eine Tetris-Version zu programmieren. Um das Spiel realistischer aussehen zu lassen, möchte ich dabei z.T. PNG-Grafiken verwenden (insbesondere als transparenten Hintergrund). Angesichts der Dateigröße beim Laden zur Design-Zeit habe ich versucht, die Grafiken in eine DLL auszulagern. Die BMP-Grafiken bekomme ich auch wieder dynamisch ins Programm zurück (also in TImage), jedoch die PNG-Grafiken nicht. :(

Kann mir jemand helfen, wie ich die PNG's nun in ein TImage lesen kann?

Vielen Dank schon mal für eure Mühe.

Bernhard Geyer 28. Aug 2010 13:52

AW: Problem beim Umgang mit DLL's
 
Ein bischen Quellcode wäre schon schön bzw. Hinweis darauf was du bisher machst wäre schon gut.
Ansonsten können wir wieder eine mundere Raterunde beginnen.

Stichwort für eine Alternative wären Ressourcen-DLL's.

Hannes91 28. Aug 2010 14:09

AW: Problem beim Umgang mit DLL's
 
Zunächst habe ich eine .rc-Datei mit folgendem Inhalt erstellt:
Code:
Bild1 PNG "Background.png"
Bild2 BMP "Grid.bmp"
Mit dieser und brcc32.exe habe ich dann eine .res-Datei erstellt.

Folgenden Code habe ich zur DLL-Erzeugung benutzt:
Delphi-Quellcode:
library Ressource;

uses
  SysUtils,
  Classes;

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

begin
end.
Nun habe ich es im Hauptprogramm geschafft (mit Hilfe :wink:), das zweite Bild (also die BMP-Grafik) dynamisch einzubinden:
Delphi-Quellcode:
var
   dllHandle: THandle;
   thisBitmap: TBitmap;
begin
     dllHandle := LoadLibrary('Ressource.dll' );

     if dllHandle <> 0
     then
         try
            thisBitmap := TBitmap.Create;

            try
               thisBitmap.Handle := LoadBitmap(dllHandle, 'Bild2' );

               if thisBitmap.Handle <> 0
               then IGrid.Picture.Bitmap.Assign(thisBitmap);
            finally
                   thisBitmap.Free;
            end;
         finally
                FreeLibrary( dllHandle );
         end;
end;
Jetzt suche ich halt einen Weg, auch die verbleibende PNG-Datei (dynamisch) einzubinden.
Ich hoffe, ich konnte zum Verständnis des Problems etwas beitragen.

himitsu 28. Aug 2010 14:18

AW: Problem beim Umgang mit DLL's
 
Warum machst du es mit den PNGs nicht genauso oder warum geht es bei dir nicht?
Natürlich mit TPngImage oder wie das heißt.

Hannes91 28. Aug 2010 14:38

AW: Problem beim Umgang mit DLL's
 
Delphi-Quellcode:
var
   dllHandle: THandle;
   thisBitmap: TBitmap;
   thisPNG : TPNGImage;
begin
     dllHandle := LoadLibrary('Ressource.dll' );

     if dllHandle <> 0
     then
         try
            thisBitmap := TBitmap.Create;
            thisPNG := TPNGImage.Create;

            try
               thisBitmap.Handle := LoadBitmap(dllHandle, 'Bild2' );
               thisPNG.Handle := //Er meckert mich an, dass TPNGImage kein Element namens Handle enthält

               if thisBitmap.Handle <> 0
               then IGrid.Picture.Bitmap.Assign(thisBitmap);
               if thisPNG.Handle <> 0
               then IHintergrund.Picture.Bitmap.Assign(thisPNG);
            finally
                   thisBitmap.Free;
            end;
         finally
                FreeLibrary( dllHandle );
         end;
end;
Und wieso enthält TPNGImage kein Handle??? Immerhin kennt er TPNGImage überhaupt! :thumb:
Kann ich dann trotzdem
Delphi-Quellcode:
LoadBitmap(dllHandle, 'Bild1')
verwenden, wenn es sich um ein PNG handelt?

Bernhard Geyer 28. Aug 2010 14:38

AW: Problem beim Umgang mit DLL's
 
Die PNG's müssen als RCData gespeichert werden. Siehe z.B. hier

Hannes91 28. Aug 2010 15:04

AW: Problem beim Umgang mit DLL's
 
Danke Bernhard, genau, was ich gesucht habe.

Tausend Dank euch allen, es funktioniert nun einwandfrei.

:cheers:

Luckie 28. Aug 2010 16:40

AW: Problem beim Umgang mit DLL's
 
Du kannst übrigens alles Units aus der uses-Klausel der DLL rausnehmen, du hast ja keinen Code, der diese benötigt.

himitsu 28. Aug 2010 16:46

AW: Problem beim Umgang mit DLL's
 
Zitat:

Zitat von Luckie (Beitrag 1045759)
Du kannst übrigens alles Units aus der uses-Klausel der DLL rausnehmen, du hast ja keinen Code, der diese benötigt.

Man kann solche DLLs auch direkt als Resource-DLL laden.
LoadLibraryEx + LOAD_LIBRARY_AS_DATAFILE
Dann wird auch nich Initialisierungscode der DLL ausgeführt.


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