![]() |
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 |
Re: DLL Einbindung - Fehler beim Beenden
Lädst du die DLL dynamisch?
|
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
|
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. |
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'; |
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. |
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?! |
Re: DLL Einbindung - Fehler beim Beenden
jawoll, die muss unbedingt als erste eingebunden werden.
Gruß onlinekater |
Re: DLL Einbindung - Fehler beim Beenden
das für zu einer Endlosschleife Exceptions nach beenden. erst 217 dann immer wieder 216.
|
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. |
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