AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Abfangen von Exceptions bei LoadLibrary
Thema durchsuchen
Ansicht
Themen-Optionen

Abfangen von Exceptions bei LoadLibrary

Ein Thema von igel457 · begonnen am 22. Dez 2008 · letzter Beitrag vom 21. Sep 2009
 
Benutzerbild von igel457
igel457

Registriert seit: 31. Aug 2005
1.622 Beiträge
 
FreePascal / Lazarus
 
#1

Abfangen von Exceptions bei LoadLibrary

  Alt 22. Dez 2008, 17:05
Hallo,

in meiner 2D-Grafikbibliothek gibt es eine Klasse, die nach allen verfügbaren Plugin-DLLs sucht. Dabei wird jede DLL in einem angegebenen Verzeichnis einzeln geladen und dann überprüft, ob sie bestimmte Funktionen exportiert.

Mein Problem ist nun das folgende: Gibt es ein Problem beim Laden der Bibliothek (wird zum Beispiel eine DLL, die die DLL benötigt nicht gefunden), so wird eine Exception geworfen. Das will ich nicht - die Bibliothek soll einfach links liegen gelassen werden.

Das kuriose ist nun, dass die Exception nur geworfen wird, wenn das Programm nicht aus dem Debugger heraus ausgeführt wird.

Mein Code:
Delphi-Quellcode:
res := FindFirst(dir+'*Andorra*'+Extension, faAnyFile, searchrec);
ahandle := 0;
while (res = 0) do
begin
  try
    try
    {$IFDEF Win32}
      ahandle := Windows.LoadLibrary(PChar(dir+searchrec.Name)); //<--- Hier wird die Exception (siehe unten) geworfen (vermute ich)
    {$ELSE}
      ahandle := dynlibs.LoadLibrary(PChar(dir+searchrec.Name));
    {$ENDIF}
    except
      //Load the next module if something didn't work...
      Continue;
    end;

    if AHandle <> 0 then
    begin
      @fileinfo := GetProcAddress(ahandle, 'Andorra2DLibraryInformation');

      //If procedure exists, it must be an Andorra 2D Plugin Library
      if @fileinfo <> nil then
      begin
        //Read fileinfo
        fileinfo(info);

        //The library must be compatible
        if info.LibVersion = LibraryVersion then
        begin
          //Call callback and pass name and information
          CallBack(searchrec.Name, info);
        end;
      end;
    end;

  finally
    if AHandle <> 0 then
      FreeLibrary(AHandle);
  end;
  res := FindNext(searchrec);
end;
Eine Beispiel-Exception (tritt auf, wenn eine von AndorraDX93D.dll benötigte Komponente gelöscht wurde):
Code:
---------------------------
Novcl: NoVCL.exe - Komponente nicht gefunden
---------------------------
Die Anwendung konnte nicht gestartet werden, weil d3dx9_31.dll nicht gefunden wurde. Neuinstallation der Anwendung könnte das Problem beheben.
---------------------------
OK  
---------------------------
Der komplette Code:
http://andorra.cvs.sourceforge.net/v...ew=markup#l_50

Nach dieser Fehlermeldung läuft das Programm munter weiter. Dieses Verhalten hat schon einige Entwickler, die mit meiner Bibliothek arbeiten irritiert.
Ich schätze, dass das Problem darin liegt, dass die Exception in der geladenen DLL geworfen wird und daher von meinem Hauptprogramm nicht abgefangen werden kann.

Vielen Dank im Voraus,
Andreas
Andreas
"Sollen sich auch alle schämen, die gedankenlos sich der Wunder der Wissenschaft und Technik bedienen, und nicht mehr davon geistig erfasst haben als die Kuh von der Botanik der Pflanzen, die sie mit Wohlbehagen frisst." - Albert Einstein
  Mit Zitat antworten Zitat
 


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 22:38 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