AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Zugriffsverletzung bei DLL-Benutzung
Thema durchsuchen
Ansicht
Themen-Optionen

Zugriffsverletzung bei DLL-Benutzung

Ein Thema von bianfable · begonnen am 27. Okt 2008 · letzter Beitrag vom 28. Okt 2008
Antwort Antwort
bianfable

Registriert seit: 20. Nov 2007
23 Beiträge
 
#1

Zugriffsverletzung bei DLL-Benutzung

  Alt 27. Okt 2008, 19:46
Hallo Leute!

Ich habe heute zum ersten mal das Programmieren mit DLLs ausprobiert und musste leider feststellen, dass es zu einer Zugriffsverletzung beim Schließen des Programms mit der DLL kommt. Es werden KEINE STRINGS übergeben, da ich bereits gelesen habe, dass das zu Problemen führen kann! Ich habe außerdem noch den Ratschlag von Delphi befolgt "Sharemem" zu den Uses der Unit UND des Projekts hinzuzufügen! Die DLL liegt auch im Stammverzeichnis des Projekts!

Hier ist der Ausschnitt aus der DLL, den ich verwende:
Delphi-Quellcode:
library Bianfable;

uses
  SysUtils, Classes, Windows, Messages, Graphics, Controls,
  Forms, Dialogs, StdCtrls, IniFiles, JPEG, ShellAPI, Menus;

procedure CenterWindow(F: TForm); stdcall;
begin
  F.Left := Screen.Width div 2 - F.Width div 2;
  F.Top := Screen.Height div 2 - F.Height div 2;
end;

//...

exports
  CenterWindow,
  //...;

begin
end.
So deklariere ich die Prozedur aus der DLL in meinem Hauptprogramm:
Delphi-Quellcode:
type
  //...

procedure CenterWindow(F: TForm); stdcall; external 'Bianfable.dll';

var
  //...
Und so benutze ich die Prozedur schließlich:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
begin
  CenterWindow(Form1);
end;
Wär echt nett, wenn ihr mir sagen könntet, was ich noch falsch mache...

Bianfable...
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.623 Beiträge
 
Delphi 12 Athens
 
#2

Re: Zugriffsverletzung bei DLL-Benutzung

  Alt 27. Okt 2008, 19:51
Du kannst keine VCL-Objekte zwischen DLL und Applikation austauschen. Dazu bräuchtest Du eine *.bpl
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
bianfable

Registriert seit: 20. Nov 2007
23 Beiträge
 
#3

Re: Zugriffsverletzung bei DLL-Benutzung

  Alt 27. Okt 2008, 19:54
Ist eine Form den eine VCL-Komponente???

Außerdem gibts die Fehlermeldung ja beim beenden des Programms, die eigentliche Verwendung des Quelltextes ist da eigentlich schon abgeschlossen (erfolgreich)!
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.623 Beiträge
 
Delphi 12 Athens
 
#4

Re: Zugriffsverletzung bei DLL-Benutzung

  Alt 27. Okt 2008, 20:05
Ja, eine Form ist auch eine VCL-Komponente. Du könntest aber z.B. das Handle der Form an die DLL übergeben und in der DLL damit arbeiten, das sollte keine Probleme geben.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

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

Re: Zugriffsverletzung bei DLL-Benutzung

  Alt 27. Okt 2008, 20:23
Es geht nicht nur um VCL-Komponenten sondern generell um Objecte. Das der Fehler erst beim Beenden kommt hast du richtig erkannt. Problem ist das die DLL und deine Anwendung getrennte Speichermanager verwenden. Beim Beenden versuchen diese den Speicher frei zugeben und da kommt es zu Fehlern weil der eine Speichermanager versucht Dinge frei zu geben die er gar nicht angefordert hat.
Aber man sollte generell keine Objecte zwischen DLL und Anwendung austauschen. Dafür gibt es BPLs. Diese haben den Vorteil das sicher gestellt wird das die Objecte in der DLL(BPL) identisch mit denen außerhalb der DLL(BPL) sind. Denn bei normaler Verwendung per DLL stellt ja niemand sicher das ein Object aus der DLL von der gleichen Delphiversion mit dem gleichen Speicheraufbau stammt.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
bianfable

Registriert seit: 20. Nov 2007
23 Beiträge
 
#6

Re: Zugriffsverletzung bei DLL-Benutzung

  Alt 28. Okt 2008, 17:01
Ok...vielen Dank!!!
  Mit Zitat antworten Zitat
Cyf

Registriert seit: 30. Mai 2008
407 Beiträge
 
Lazarus
 
#7

Re: Zugriffsverletzung bei DLL-Benutzung

  Alt 28. Okt 2008, 18:20
Zitat von SirThornberry:
Es geht nicht nur um VCL-Komponenten sondern generell um Objecte. Das der Fehler erst beim Beenden kommt hast du richtig erkannt. Problem ist das die DLL und deine Anwendung getrennte Speichermanager verwenden. Beim Beenden versuchen diese den Speicher frei zugeben und da kommt es zu Fehlern weil der eine Speichermanager versucht Dinge frei zu geben die er gar nicht angefordert hat.
Aber man sollte generell keine Objecte zwischen DLL und Anwendung austauschen. Dafür gibt es BPLs. Diese haben den Vorteil das sicher gestellt wird das die Objecte in der DLL(BPL) identisch mit denen außerhalb der DLL(BPL) sind. Denn bei normaler Verwendung per DLL stellt ja niemand sicher das ein Object aus der DLL von der gleichen Delphiversion mit dem gleichen Speicheraufbau stammt.
Hatte (da ich eigentlich noch nie Objekte in einer dll gebraucht habe) das Problem zwar nocht nicht, aber kannst du das bitte nochmal genauer ausführen? Wie sieht es zum Beispiel mit einer einfachen von TObject abgeleiteten Klasse aus, die nicht ausgetauscht wird, sondern einfach nur in der dll verwendet wird?
  Mit Zitat antworten Zitat
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#8

Re: Zugriffsverletzung bei DLL-Benutzung

  Alt 28. Okt 2008, 18:33
Ich verstehe nicht warum, immer alle sagen, zwischen DLL und Host könnten keine Objekte ausgetauscht werden. In meiner 2D Bibliothek mache ich das ständig und das funktioniert einwandfrei. Wer es nicht glauben kann schaut hier nach:

DLL-Hauptunit:
http://andorra.cvs.sourceforge.net/v...22&view=markup

DLL-Klassenimplementierungen:
http://andorra.cvs.sourceforge.net/v...53&view=markup

Die einzige Einschränkung, die mir bis jetzt aufgefallen ist, ist die Tatsache, dass man nicht auf die RTTI Informationen der im Plugin erzeugten Objekte zugreifen kann und das man in der DLL keine größeren Speicherbereiche reservieren kann, auf die dann die Hostapplikation zugreifen darf. In die andere Richtung geht jedoch auch das einwandfrei.

Ich schätze das die BPLs zum großen Teil nur das Problem mit den RTTI Informationen beheben.

Daher vermute ich, dass das hier geschilderte Problem von den in der DLL verwendeten Units kommt, die beim Entladen der Bibliothek versuchen Finalisierungsarbeiten auszuführen, die dann (also in der Bibliothek) jedoch nicht funktionieren.
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Zugriffsverletzung bei DLL-Benutzung

  Alt 28. Okt 2008, 21:23
Ich sehe beim modulübergreifenden Arbeiten mit DLLs zwei Probleme.
1. Wenn Objekte Strings oder andere Sprachkonstrukte verwenden, die den Speichermanager nutzen. Besonders fies ist das bei Bibliotheken wie der VCL.
2. Wenn explizit oder implizit auf die RTTI zugegriffen wird. Ich habe hier mal einen Ersatz für den as-Operator gepostet, der das Problem umgeht. Mit externen Bibliotheken funktioniert er natürlich nicht. Interessanterweise verwendet Delphi selbst einen modifizierten is-Operator beim Exception-Handling mit der on-EWuppdi-do-Syntax, sodass es möglich sein sollte, modulübergreifend Exceptions zu fangen.

Worin ich ehrlich gesagt kein Problem sehe, ist das Allozieren und Freigeben von Objekten. Glücklicherweise sind nämlich TObject.Destroy und TObject.FreeInstance virtuell, sodass der richtige Speichermanager das Objekt freigibt.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  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 09:06 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