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.