AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

EAccessViolation beim beenden

Ein Thema von axio · begonnen am 7. Dez 2005 · letzter Beitrag vom 7. Dez 2005
Antwort Antwort
axio

Registriert seit: 3. Dez 2005
3 Beiträge
 
Delphi 6 Enterprise
 
#1

EAccessViolation beim beenden

  Alt 7. Dez 2005, 17:35
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
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#2

Re: EAccessViolation beim beenden

  Alt 7. Dez 2005, 17:55
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
axio

Registriert seit: 3. Dez 2005
3 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: EAccessViolation beim beenden

  Alt 7. Dez 2005, 18:13
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 .
  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 02:40 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