Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Bitmap in DLL bearbeiten, dann zurück zu Hauptprogramm? (https://www.delphipraxis.net/84101-bitmap-dll-bearbeiten-dann-zurueck-zu-hauptprogramm.html)

SevenOfNine 11. Jan 2007 11:11


Bitmap in DLL bearbeiten, dann zurück zu Hauptprogramm?
 
Hallo zusammen,
ich schreibe an einem Programm, welches DLLs als Plugins verwendet. Einfach erklärt soll folgendes passieren:
Im Hauptprogramm befindet sich auf dem Formular ein TImage. Bei bestimmten Ereignissen soll das Bitmap des Images an eine DLL übergeben werden. Die DLL verändert das Bitmap, indem sie z.B. Text im Canvas ausgibt, fertig.

Ich habe nun folgendes Problem. Das funktioniert alles schön, nur gibt es beim Beenden des Hauptprogramms ein Exception. Ich vermute mal, es liegt an der Speicherverwaltung, bzw. daran, daß ich in der DLL auf VCL-Komponente des Hauptprogramms zugreife.

Mit ShareMem habe ich es auch schon versucht, nur dann bekomme ich bereits beim Programmablauf ein Exception.

Um erst mal das Programm weiter zu entwickeln, mache ich ein Workaround:
  • Hauptprogramm speichert das Bitmap in ein File (SaveToFile)
  • Hauptprogramm ruft Funktion in DLL auf
  • DLL erzeugt ein Bitmap und liest es aus dem File (LoadFromFile)
  • DLL ändert das Bitmap und speichert es wieder (SaveToFile)
  • Zum Schluß ruft DLL eine Callback-Funktion des Hauptprogramms auf, DLL ist fertig.
  • Die Callback-Funktion im Hauptprogramm kopiert Bitmap im File ins Image.Bitmap (LoadFromFile)

Ich nutze also anstelle des Arbeitsspeichers den Festplattenspeicher zur Datenübergabe, was natürlich nicht sehr elegant ist.

Ich habe dann noch versucht die Bitmapdaten über TMemoryStream zu übergeben, da tut sich nur nichts.

Delphi-Quellcode:
type
  TPluginRecord = packed record
     MemoryStream: TMemoryStream;
     PluginSend : procedure(Befehl : PChar; Parameter : Pointer);  // Callback
end;

Bitmap.SaveToStream(TPluginRecord(Parameter^).MemoryStream); // in der DLL, innerhalb einer procedure, Parameter ist das Record

procedure PluginCallback(Befehl : PChar; Parameter : Pointer); // im Hauptprogramm
begin
    Form1.Image1.Picture.Bitmap.LoadFromStream(MemStream);
    Form1.Image1.Repaint;
end;
Also im obigen Fall tut sich nichts. Gehe ich über SaveToFile/LoadFromFile funktioniert es.

Ich hoffe, ich konnte euch mein Problemchen ausreichend erklären, bin nämlich eher Delphi-Beginner, sieht man ja auch an der Anzahl meiner Beiträge :wink:

Vielleicht kann mir hier ja jemand mal Tipps geben, schon mal Danke im voraus!

Gruß
Dirk

yörsch 11. Jan 2007 12:49

Re: Bitmap in DLL bearbeiten, dann zurück zu Hauptprogramm?
 
Keine ahnung wo dein Problem ist
Aber versuchs mal mit FASTMM4 ! :gruebel:

Das ding Protokolliert Speicherlecks sehr gut!

http://fastmm.sourceforge.net

Gruß
Jörg

ste_ett 11. Jan 2007 13:02

Re: Bitmap in DLL bearbeiten, dann zurück zu Hauptprogramm?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Anbei mal ein kleines Beispiel. :)

Übergeben wird das Handel (HDC) der Canvas-Variable der Instanz der TImage-Klasse.

SevenOfNine 11. Jan 2007 13:11

Re: Bitmap in DLL bearbeiten, dann zurück zu Hauptprogramm?
 
Zitat:

Zitat von ste_ett
Anbei mal ein kleines Beispiel. :)

Übergeben wird das Handel (HDC) der Canvas-Variable der Instanz der TImage-Klasse.

Hallo ste_ett,
das ist genau die Info, die ich gesucht habe ... probiere ich gleich mal aus, Danke! :thumb:

EDIT:
So, ich habe es mal getestet, funktioniert sehr gut!
Auf Canvas male ich in der DLL folgendermaßen (Beispiel):
Delphi-Quellcode:
procedure DrawToCanvas(ADC: HDC);
var
   LCanvas: TCanvas;
   i: integer;
begin
   LCanvas := TCanvas.Create;
   LCanvas.Handle := ADC;
   LCanvas.Font.Name := 'Arial Black';
   LCanvas.Font.Size := 12;
   i := LCanvas.TextWidth('TestText');
   LCanvas.TextOut((320-i) div 2, 10, 'TestText'); // Zentrieren, Breite = 320
   LCanvas.Handle := 0;
   LCanvas.Free;
end;
Gruß
Dirk


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:59 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