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:
########################################
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.
Vielleicht wisst ihr ja hier weiter, danke schon im voraus.
mfg, Michael.
[EDIT=Christian Seehase]Delphi Tags hinzugefügt[/EDIT]