Einzelnen Beitrag anzeigen

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, 18: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