Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   DLL Einbindung - Fehler beim Beenden (https://www.delphipraxis.net/74325-dll-einbindung-fehler-beim-beenden.html)

fsc 1. Aug 2006 12:49


DLL Einbindung - Fehler beim Beenden
 
Moin!

Ich habe ein nettes kleines Tool geschrieben, womit man Einträge einer Tabelle ändern kann. --> Das funktioniert soweit.
Jetzt gibt es noch ein paar weitere Programme die ähnliche Aufgaben erfüllen. Der Sicherheit halber habe ich jede Tabelle mit den gleichen Feldern erweitert und frage diese dann per DLL ab und zeige sie an. Funktioniert bis dahin auch ganz wunderbar...

Wenn ich dann jedoch das Programm letztendlich beende (mit einem simplen "close"), kommt folgende Fehlermeldung: "Die Anweisung in xyz verweist auf Speicher in 123. Der Vorgang "read" konnte nicht auf dem Speicher ausgeführt werden." Danach kommt dann noch, "Runtime error 216 at xyz". Gestern habe ich das Internet bereits durchforstet nach Lösungen.

Meine CPU ist nicht zu schnell und ich habe auch keinen SubSeven auf dem Rechner. Hat jemand eine weitere Idee?

Sobald ich die Dll aus meinem Programm wieder entferne, geht alles wie vorher. Meine Frage lautet also: Was passiert eigentlich im Hintergrund wenn eine DLL aufgerufen wird? Innerhalb der DLL gebe ich alles was ich erzeugt habe auch wieder frei.

Vielen Dank im vorraus!

fsc

Luckie 1. Aug 2006 12:52

Re: DLL Einbindung - Fehler beim Beenden
 
Lädst du die DLL dynamisch?

fsc 1. Aug 2006 13:55

Re: DLL Einbindung - Fehler beim Beenden
 
nein sie ist statisch eingebunden. Es wird auch nur eine procedure aufgerufen, welche einer Datenbank Werte bzw Felder entnimmt und diese in ein StringGrid füllt.. dann modal anzeigt das wars

Robert Marquardt 1. Aug 2006 14:43

Re: DLL Einbindung - Fehler beim Beenden
 
Ist die DLL in Delphi geschrieben? Wurde ShareMem in DLL und Hauptprogramm verwendet?
Poste mal die Deklaratino der aufgerufenen Funktion.

fsc 1. Aug 2006 15:31

Re: DLL Einbindung - Fehler beim Beenden
 
die DLL habe ich mit Delhpi gemacht. ShareMem habe ich nicht verwendet.
Was macht ShareMem? :?:

Dekalration unter Implemtation steht:
...
procedure benutzer(Provider,feld,eintrag,einrag_detail:strin g)stdcall; external 'Aenderungsinfo.dll';

Robert Marquardt 2. Aug 2006 05:10

Re: DLL Einbindung - Fehler beim Beenden
 
Klassischer Fehler.
Sowohl in Hauptprogramm als auch DLL muss ShareMem eingebunden werden.
DLL und Hauptprogramm haben sonst separate Memorymanager.
Uebergibt und manipuliert man nun Strings oder Objekte (alles was dynamisch alloziiert ist), so wird Memory im einen Manager alloziiert und im anderen freigegeben.
Das Resultat ist dann schnell ein korrumpierter Memorymanager und irgendwann (oft beim Programmende) gibt es einen Absturz.
ShareMem verbindet beide Memorymanager so das es dann wieder einer ist.

Erzeuge mal ein leeres DLL-Projekt mit Delphi und lies dir durch was im Kommentar des erzeugten Files steht.

fsc 2. Aug 2006 09:09

Re: DLL Einbindung - Fehler beim Beenden
 
Danke erstmal!

Also ShareMem habe ich eingebunden..., einfach nur in die uses Liste, nicht wahr?

Jetzt erscheint beim schließen des aus der DLL heraus erzeugten Fensters eine Exception und beim Beenden einer dieser Windows Fehler: "Programm.exe hat einen Fehler verursacht" usw. Danach der Runtime error 217. Mit dem Datentyp ShortString und Pchar passiert das gleiche...

EDIT: Muss die DLL wirklich als erste Unit eingebunden werden oder ist das quatsch?!

TBx 2. Aug 2006 09:30

Re: DLL Einbindung - Fehler beim Beenden
 
jawoll, die muss unbedingt als erste eingebunden werden.

Gruß

onlinekater

fsc 2. Aug 2006 09:46

Re: DLL Einbindung - Fehler beim Beenden
 
das für zu einer Endlosschleife Exceptions nach beenden. erst 217 dann immer wieder 216.

TBx 2. Aug 2006 09:58

Re: DLL Einbindung - Fehler beim Beenden
 
poste doch mal Deinen Code, vielleicht können wir Dir dann helfen.

Definitiv muß sharemem sowohl im aufrufenden Projekt (nicht in dessen Mainform oder sonstwo) als auch in der DLL als erstes in die USES-Klausel aufgenommen werden.

Gruß

onlinekater


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:14 Uhr.
Seite 1 von 3  1 23      

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz