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