AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler bei FreeLibrary

Ein Thema von Thanatos81 · begonnen am 13. Nov 2007 · letzter Beitrag vom 14. Nov 2007
Antwort Antwort
Thanatos81
(Gast)

n/a Beiträge
 
#1

Fehler bei FreeLibrary

  Alt 13. Nov 2007, 15:12
Moin Moin!

Ich hab hier ein kleines Problem beim Benutzen einer DLL. Im FormCreate rufe ich folgendes auf:

Delphi-Quellcode:
DLLHandle := LoadLibrary('OpAgent.dll');
if DLLHandle <> 0 then
begin
  //Funktionen aus der DLL dynamisch laden
  @OPAStart := GetProcAddress(DLLHandle, 'OPAStart');
  @OPAConnect := GetProcAddress(DLLHandle, 'OPAConnect');
  @OPAClose := GetProcAddress(DLLHandle, 'OPAClose');
  @OPAFetch := GetProcAddress(DLLHandle, 'OPAFetch');
  @OPAWrite := GetProcAddress(DLLHandle, 'OPAWrite');
end;
Im FormDestroy
Delphi-Quellcode:
//falls die DLL beim Programmstart geladen wurde, diese wieder freigeben
if DLLHandle <> 0 then
  FreeLibrary(DLLHandle);
Jetzt knallt bei FreeLibrary allerdings. Ich bekommen eine wunderbare Zugriffsverletzung
Das seltsame ist: Kompiliere ich mit Laufzeitpackages, knallt es nicht. Leider kann ich das Projekt aufgrund von Vorgaben nicht mit Laufzeitpackages ausliefern und der Quelltext der DLL liegt mir auch nicht vor.

Jemand schon einmal ein Ähnliches Phänomen gehabt?

Danke im Voraus!
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#2

Re: Fehler bei FreeLibrary

  Alt 13. Nov 2007, 15:22
Wurden auch schön alle Objekte wieder aufgeräumt die angefordert wurden?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#3

Re: Fehler bei FreeLibrary

  Alt 13. Nov 2007, 15:33
Werden vllt. die importierten Funktionen zufälligerweise zeitlich in der Nähe der FreeLibrary() aufgerufen?
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: Fehler bei FreeLibrary

  Alt 13. Nov 2007, 15:34
Hallo,

1. Strings als Parameter verwendet ?
2. knallt es auch, wenn due FreeLibrary direkt nach dem GetProcAddress aufrufst,
als keine Funktionen aufrufst ?
3. debugge doch die Dll.


Heiko
Heiko
  Mit Zitat antworten Zitat
Thanatos81
(Gast)

n/a Beiträge
 
#5

Re: Fehler bei FreeLibrary

  Alt 13. Nov 2007, 15:58
@Bernhard
Das ist eine verdammt gute Frage. Habe mal ein Testprogramm nur mit der DLL und zwei Buttons geschrieben zum Testen:

Delphi-Quellcode:
var
  Form1: TForm1;
  DLLHandle: Integer;

  OPAStart: function: Integer; cdecl;
  OPAConnect: function(ltsap, rtsap, host: PChar; lpHandle: PDWORD; callback:
    PCALLBACK): Integer; cdecl;
  OPAClose: function(handle: DWORD): Integer; cdecl;
  OPAFetch: function(handle: DWORD; lpOperand: PChar; lpBuffer: PVOID;
    BufferSize: DWORD; callback: PCALLBACK): Integer; cdecl;
  OPAWrite: function(handle: DWORD; lpOperand: PChar; lpBuffer: PVOID;
    BufferSize: DWORD; callback: PCALLBACK): Integer; cdecl;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin
  DLLHandle := LoadLibrary('OpAgent.dll');
  if DLLHandle <> 0 then
  begin
    //Funktionen aus der DLL dynamisch laden
    @OPAStart := GetProcAddress(DLLHandle, 'OPAStart');
    @OPAConnect := GetProcAddress(DLLHandle, 'OPAConnect');
    @OPAClose := GetProcAddress(DLLHandle, 'OPAClose');
    @OPAFetch := GetProcAddress(DLLHandle, 'OPAFetch');
    @OPAWrite := GetProcAddress(DLLHandle, 'OPAWrite');

    //OPAStart;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if DLLHandle <> 0 then
  begin
    try
      FreeLibrary(DLLHandle);
    except
      showMessage('2');
    end;
  end;
end;
Nehme ich das "OPAStart" wieder rein, erhalte ich beim FreeLibrary den selben Fehler wie im eigentlichen Programm. Lasse ich es auskommentiert kann ich so oft ich möchte abwechselnd Button1 und Button2 klicken.

Der Rückgabewert von OPStart ist allerdings nur ein ErrorCode, also kein Zeiger auf ein Objekt oder Ähnliches.

Was mich noch wundert: Das try..excpet..end fängt den Fehler nicht ab sondern wird anscheinend vollkommen ignoriert.

@Muetze1 (roter Kasten sei Dank )
Nein, daran liegt es leider nicht, da könne auch ruhig mehrere Sekunden vergehen.

@hoika (roter Kasten sei Dank )

1.) ShareMem ist das erste in der uses-Klausel der Projektdatei, aber wie man weiter oben sieht werden nur PChar genutzt, keine Strings.
2.) Nein, siehe oben in diesem Beitrag.
3.) Wie debugge ich eine Fremd-DLL zu der mir kein Quelltext vorliegt? Gibts da irgendwo ein empfehlenswertes Tutorial?
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#6

Re: Fehler bei FreeLibrary

  Alt 13. Nov 2007, 16:09
Sicher das es cdecl als Aufrufkonvention ist und nicht stdcall o.ä.?
  Mit Zitat antworten Zitat
Apollonius

Registriert seit: 16. Apr 2007
2.325 Beiträge
 
Turbo Delphi für Win32
 
#7

Re: Fehler bei FreeLibrary

  Alt 13. Nov 2007, 16:11
Da OPAStart parameterlos ist, kann der Stack eigentlich nicht durch falsche Aufrufkonvention zerschossen werden.
Wer erweist der Welt einen Dienst und findet ein gutes Synonym für "Pointer"?
"An interface pointer is a pointer to a pointer. This pointer points to an array of pointers, each of which points to an interface function."
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.171 Beiträge
 
Delphi 10.4 Sydney
 
#8

Re: Fehler bei FreeLibrary

  Alt 13. Nov 2007, 16:13
Zitat von Thanatos81:
Nehme ich das "OPAStart" wieder rein, erhalte ich beim FreeLibrary den selben Fehler wie im eigentlichen Programm. Lasse ich es auskommentiert kann ich so oft ich möchte abwechselnd Button1 und Button2 klicken.
Wie wäre es mit Aufruf von OPAClose? Wer weis was alles bei OPAStart für Aktionen ausgeführt werden?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#9

Re: Fehler bei FreeLibrary

  Alt 13. Nov 2007, 17:04
Zitat von Apollonius:
Da OPAStart parameterlos ist, kann der Stack eigentlich nicht durch falsche Aufrufkonvention zerschossen werden.
Da bei CDECL im Gegensatz zu allen anderen Formen der Aufrufer den Stack bereinigt, hatte ich dies vermutet. Schliesslich wusste ich nun nicht aus der Mütze ob der Rückgabewert bei cdecl über Register oder vllt. über Stack zurück gegeben wird...
  Mit Zitat antworten Zitat
Thanatos81
(Gast)

n/a Beiträge
 
#10

Re: Fehler bei FreeLibrary

  Alt 14. Nov 2007, 07:08
Nun, die Aufrufkonvention habe ich aus einem Beispielprojekt des Herstellers, indem die DLL fest eingebunden ist. OPAClose ist leider nicht das Gegenstück zu OPAStart, sondern zu OPAConnect. OPAConnect baut eine TCP/IP-Verbindung zu einem bestimmten Gerät auf und OPAClose beendet diese wieder.

Gibt es eine Möglichkeit alle exportierten Methoden einer DLL herauszufinden? Vielleicht gibt es ja ein OPAStop o.Ä. und der Hersteller hat dies nur nicht dokumentiert.
//Edit
Selber ne Möglichkeit gefunden (Danke Assarbad ) Leider gibts keine Stop-Routine.
  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 10:53 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