![]() |
DLLs laden entladen gibt Fehlermeldung
Hallo,
ich habe vor eine DLL dynamisch zu laden und wieder freizugeben mittels LoadLibrary und FreeLibrary, das funktioniert auch alles ganz gut auch das aufrufen einer eingebauten funktion der DLL. Jetzt bekomme ich aber die Fehlermeldung 217 wenn ich das aufrufende Programm wieder schliesse! Die DLL wird anstandslos geladen, benutzt und wieder entfernt, hat jemand von euch schon einmal ein ähnliches Problem gehabt? Ich habe schon mehr über dieses Thema gelesen und es scheint kein einzelfall zu sein, leider konnte mir aber kein thread helfen :( Hier mal die Sourcecodes: Edit1.Text := TestDLL.dll Edit2.Text := getPluginInfo EXE
Delphi-Quellcode:
########################################
unit u_test; interface uses ShareMem, Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) Label1: TLabel; Button1: TButton; Bevel1: TBevel; Edit1: TEdit; Edit2: TEdit; Label2: TLabel; Label3: TLabel; Label4: TLabel; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); // Unser Grundkonstrukt das die Parameter der DLL // darstellt (in diesem Fall keine) und den // Rückgabewert festlegt. Type TgetPluginInfo = function : String; // Die benötigten Variablen Var TestFunktion : TgetPluginInfo; FuncPtr : TFarProc; DLLHandle : THandle; begin DLLHandle := LoadLibrary( PChar( Edit1.Text ) ); IF DLLHandle > 0 then begin FuncPtr := GetProcAddress( DLLHandle, Pchar( Edit2.Text ) ); IF Assigned (FuncPTR) then begin @TestFunktion := FuncPtr; Label4.Caption := 'Antwort: '+Edit1.Text+' - '+TestFunktion; FuncPtr := NIL; end else ShowMessage('Funktion ('+edit2.text+') konnte nicht gefunden werden!'); end else ShowMessage('DLL ('+edit1.text+') konnte nicht geladen werden!'); IF NOT( FreeLibrary( DLLHandle ) ) then ShowMessage('DLL konnte nicht entladen werden'); end; end. DLL
Delphi-Quellcode:
Vielleicht wisst ihr ja hier weiter, danke schon im voraus.
########################################
library TestDLL; { Wichtiger Hinweis zur DLL-Speicherverwaltung: ShareMem muß sich in der ersten Unit der unit-Klausel der Bibliothek und des Projekts befinden (Projekt- Quelltext anzeigen), falls die DLL Prozeduren oder Funktionen exportiert, die Strings als Parameter oder Funktionsergebnisse übergeben. Das gilt für alle Strings, die von oder an die DLL übergeben werden -- sogar für diejenigen, die sich in Records und Klassen befinden. Sharemem ist die Schnittstellen-Unit zur Verwaltungs-DLL für gemeinsame Speicherzugriffe, BORLNDMM.DLL. Um die Verwendung von BORLNDMM.DLL zu vermeiden, können Sie String- Informationen als PChar- oder ShortString-Parameter übergeben. Weiterhin ist bei exportierten Funktionen auf die korrekte Groß/Kleinschreibung zu achten da 32bit DLL's diese berücksichtigen. } uses ShareMem, SysUtils, Classes; {$R *.res} // Eine zu exportierende Funktion { **************************************************************************** } function getPluginInfo : String; Export; begin // Diese Funktion liefert einen ganz simplen String // zurück, der den DateiNamen des Plugins darstellt. getPluginInfo := 'Mein Name ist TestDLL'; end; // Die Auflistung aller Funktionen die diese DLL exportiert { **************************************************************************** } exports getPluginInfo; // Initialisierung der DLL, wird ausgeführt beim laden vom aufrufenden Programm { **************************************************************************** } begin end. mfg, Michael. [EDIT=Christian Seehase]Delphi Tags hinzugefügt[/EDIT] |
Danke
Hallo,
das mit den Delphi Tags sieht gut aus, danke fürs edit :) |
Moin mika,
ich hab' mal bei Borland nach "runtime error 217" gesucht. Eine Fundstelle :shock: Und dies hier ist das ganze Ergebnis: Zitat:
Vielleicht hilft das ja schon. |
update pack
hallo christian,
ja das update pack #2 habe ich installiert. vielleicht liegt es an der einbindung einer funktio die als ergebniswert string enthält. wenn man sowas in seine dll einbindet muss man an erster stelle der dll ShareMem usen (was ich auch gemacht habe) ich habe das sogar im aufrufenden Programm so eingebunden. ich finde es aber höchst seltsam das ich die dll laden kann, die funktion ausgeführt wird und ich die dll wieder entladen kann, wenn ich aber das programm schliessen will diese meldung kommt. hmm, da müssen wir mal weitersuchen, sonst vielleicht noch jemand n vorschlag? :) hoffentlich ist das nicht irgendso ein kleiner fehler der einem nicht auffällt!!! peinlich peinlich mfg, Michael |
Moin mika,
Zitat:
|
:)
ich wusste doch das es irgend so ein kleiner fehler ist!
peinlich peinlich :)) während man sich im kopf die kompliziertesten Sachen zusammendenkt fällt einem irgendein kleiner fehler gar nicht mehr auf weil man auf so was simples gar nicht kommt :) naja, jedenfalls funktioniert es jetzt :) danke für die hilfe. nett von dir. mfg, mikele. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:06 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 by Thomas Breitkreuz