AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi DLLs laden entladen gibt Fehlermeldung
Thema durchsuchen
Ansicht
Themen-Optionen

DLLs laden entladen gibt Fehlermeldung

Ein Thema von mika · begonnen am 3. Dez 2002 · letzter Beitrag vom 3. Dez 2002
Antwort Antwort
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
Benutzerbild von mika
mika

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

Danke

  Alt 3. Dez 2002, 11:10
Hallo,

das mit den Delphi Tags sieht gut aus, danke fürs edit
:: don't Panic ::
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#3
  Alt 3. Dez 2002, 11:26
Moin mika,

ich hab' mal bei Borland nach "runtime error 217" gesucht.
Eine Fundstelle

Und dies hier ist das ganze Ergebnis:

Zitat von Borland Developer Support:
"Runtime Error 217" when unloading an ISAPI dll or the termination of a CGI application happens. Or, your web server simply crashes when trying to unload a WebSnap ISAPI dll.
This is fixed in Delphi 6 update pack 2.
Hast Du auch Update Pack 2 installiert?
Vielleicht hilft das ja schon.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von mika
mika

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

update pack

  Alt 3. Dez 2002, 11:59
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
:: don't Panic ::
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.116 Beiträge
 
Delphi 11 Alexandria
 
#5
  Alt 3. Dez 2002, 12:15
Moin mika,

Zitat:
ShareMem muß sich in der
ersten Unit der unit-Klausel
der Bibliothek und des Projekts befinden (Projekt-
Quelltext anzeigen)
Hast Du ShareMem auch dort eingebunden? (.DPR Datei)
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von mika
mika

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

:)

  Alt 3. Dez 2002, 12:20
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.
:: don't Panic ::
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:26 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz