Einzelnen Beitrag anzeigen

Benutzerbild von mika
mika

Registriert seit: 25. Okt 2002
176 Beiträge
 
Delphi 6 Professional
 
#1

DLLs laden entladen gibt Fehlermeldung

  Alt 3. Dez 2002, 10:38
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]
:: don't Panic ::
  Mit Zitat antworten Zitat