Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi EAccessViolation beim beenden (https://www.delphipraxis.net/58479-eaccessviolation-beim-beenden.html)

axio 7. Dez 2005 16:35


EAccessViolation beim beenden
 
hi!
ich habe folgendes problem:
Nachdem ich eine funktion, die den Hintergrund eines Images zeichnen soll, in eine dll ausgelagert habe, gibt das Programm beim Beenden eine EAccessViolation aus.

Inhalt der dll:
Delphi-Quellcode:
library func;

uses
  SysUtils, Graphics, Windows, Classes;

{$R *.res}

procedure DrawColor(const Canvas: TCanvas; Width: integer; Height: integer; ColorR, ColorG, ColorB: Byte);
begin
 Canvas.Brush.Color:=RGB(ColorR, ColorG, ColorB);// 1)
 Canvas.Rectangle(-1, -1, Width + 1, Height + 1);
end;

exports
 DrawColor;

begin
end.
zu 1): nachdem ich mich ein bisschen herumgespielt habe, bin ich darauf gekommen, dass beim entfernen dieser zeile der fehler beim beenden nicht auftritt (natürlich wird dadurch der Hintergrund auch weiß gezeichnet).

Übrigens, als ich eine 2. Funktion einbinden wollte, die einen Farbverlauf zeichnet, diese ebenfalls den selben fehler auslöste, und mich wieder ein bisschen mit den Code gespielt habe, habe ich herausgefunden, dass es anscheinend an der zuweisung von eigenschaften an die TCanvas-Variable IN der dll liegt. Aber wieso? Und wie könnte ich das problem lösen?

Danke im voraus, mfg,
axio

SirThornberry 7. Dez 2005 16:55

Re: EAccessViolation beim beenden
 
wenn man ein neues DLL projekt anlegt steht da oben drin ein ganz wichtiger Text den du so wie es aussieht einfach entfernt hast ohne ihn zu lesen/verstehen. Du Darfst nicht einfach Objecte, Strings und andere Dinge die mit dynamischer Speicherverwaltung zu tun haben zwischen DLL hin und her reischen außer die bindest die ShareMem ein (wie es in dem besagten Text steht). Wenn du anstelle von TCanvas einfach Canvas.Handle an die funktion übergibst (der Typ ist HDC) dann kannst du innerhalb der DLL einem TCanvasObject dieses Handle zuweisen und genau so arbeiten wie bisher ohne das ein fehler auftaucht.

Ändere Sie einfach wie folgt ab:
Delphi-Quellcode:
procedure DrawColor(const CanvasHandle: HDC; Width: integer; Height: integer; ColorR, ColorG, ColorB: Byte);
var LCanvas: TCanvas;
begin
  LCanvas := TCanvas.Create;
  LCanvas.Handle := CanvasHandle;
  LCanvas.Brush.Color:=RGB(ColorR, ColorG, ColorB);// 1)
  LCanvas.Rectangle(-1, -1, Width + 1, Height + 1);
  LCanvas.Handle := 0;
  LCanvas.Free;
end;

axio 7. Dez 2005 17:13

Re: EAccessViolation beim beenden
 
Danke für die rasche und überaus aufschlussreiche Antwort! Funktioniert prima.

PS: Gelesen habe ich den Hinweiß schon, aber anscheinend habe ich ihn wirklich nicht ausreichend verstanden um die Problematik dahinter zu verstehen. Absofort werde ich den Hinweis mehr beherzigen :wink: .


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