Einzelnen Beitrag anzeigen

SevenOfNine

Registriert seit: 11. Jan 2007
Ort: Giessen, Mittelhessen
41 Beiträge
 
Delphi 7 Professional
 
#1

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

  Alt 11. Jan 2007, 12:11
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

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

Gruß
Dirk
Mein Kindheitstraum: Die 32bit Farbpalette als Bundstiftsammlung.
  Mit Zitat antworten Zitat