AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Bitmap in DLL bearbeiten, dann zurück zu Hauptprogramm?
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von SevenOfNine · begonnen am 11. Jan 2007 · letzter Beitrag vom 11. Jan 2007
Antwort Antwort
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, 11: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
Benutzerbild von yörsch
yörsch

Registriert seit: 10. Jan 2007
Ort: Lampertheim
206 Beiträge
 
Delphi XE2 Architect
 
#2

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

  Alt 11. Jan 2007, 12:49
Keine ahnung wo dein Problem ist
Aber versuchs mal mit FASTMM4 !

Das ding Protokolliert Speicherlecks sehr gut!

http://fastmm.sourceforge.net

Gruß
Jörg
Jörg
have FUN
  Mit Zitat antworten Zitat
Benutzerbild von ste_ett
ste_ett

Registriert seit: 10. Sep 2004
Ort: Dülmen
464 Beiträge
 
Delphi 7 Professional
 
#3

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

  Alt 11. Jan 2007, 13:02
Anbei mal ein kleines Beispiel.

Übergeben wird das Handel (HDC) der Canvas-Variable der Instanz der TImage-Klasse.
Angehängte Dateien
Dateityp: zip addlogo_463.zip (16,7 KB, 23x aufgerufen)
Stefan
"Geht nicht!" ist keine Fehlerbeschreibung und "Hab ich schon versucht!" keine Antwort!

Hey, it compiles! Ship it!
  Mit Zitat antworten Zitat
SevenOfNine

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

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

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

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
Mein Kindheitstraum: Die 32bit Farbpalette als Bundstiftsammlung.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:18 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz