Переглянути джерело

* InitializeLibrary defaults now the parameter NoSymbolErrors to true and no longer to false. Now it's the same behavior as in 2.4.0 release. But of course it's not optimal and not safe.
* LoadLibrarySymbols report now all symbol errors and not just the first one. Eg. it try to load all symbols and don't stop on first error now.

git-svn-id: trunk@16269 -

ivost 14 роки тому
батько
коміт
4e39959ca1
1 змінених файлів з 21 додано та 12 видалено
  1. 21 12
      rtl/inc/dynlibs.pas

+ 21 - 12
rtl/inc/dynlibs.pas

@@ -75,6 +75,9 @@ type
     weak: Boolean;   { weak }
   end;
 
+  PLibSymbolPtrArray = ^TLibSymbolPtrArray;
+  TLibSymbolPtrArray = array of PLibSymbol;
+
   TLibHandler = record
     InterfaceName: String;                { abstract name of the library }
     Defaults     : array of String;       { list of default library filenames }
@@ -98,13 +101,13 @@ function LibraryHandler(const InterfaceName: String; const DefaultLibraries: arr
 
 { initialization/finalization }
 function TryInitializeLibrary(var Handler: TLibHandler; const LibraryNames: array of String;
-  const User: Pointer = nil; const NoSymbolErrors: Boolean = False): Integer;
+  const User: Pointer = nil; const NoSymbolErrors: Boolean = True): Integer;
 function TryInitializeLibrary(var Handler: TLibHandler; const LibraryName: String = '';
-  const User: Pointer = nil; const NoSymbolErrors: Boolean = False): Integer;
+  const User: Pointer = nil; const NoSymbolErrors: Boolean = True): Integer;
 function InitializeLibrary(var Handler: TLibHandler; const LibraryNames: array of String;
-  const User: Pointer = nil; const NoSymbolErrors: Boolean = False): Integer;
+  const User: Pointer = nil; const NoSymbolErrors: Boolean = True): Integer;
 function InitializeLibrary(var Handler: TLibHandler; const LibraryName: String = '';
-  const User: Pointer = nil; const NoSymbolErrors: Boolean = False): Integer;
+  const User: Pointer = nil; const NoSymbolErrors: Boolean = True): Integer;
 function ReleaseLibrary(var Handler: TLibHandler): Integer;
 
 { errors }
@@ -114,7 +117,7 @@ procedure RaiseLibraryException(var Handler: TLibHandler);
 
 { symbol load/clear }
 function LoadLibrarySymbols(const Lib: TLibHandle; const Symbols: PLibSymbol; const Count: Integer;
-  const ErrorSym: PPLibSymbol = nil): Boolean;
+  const ErrorSymbols: PLibSymbolPtrArray = nil): Boolean;
 procedure ClearLibrarySymbols(const Symbols: PLibSymbol; const Count: Integer);
 
 
@@ -182,8 +185,9 @@ end;
 function TryInitializeLibraryInternal(var Handler: TLibHandler; const LibraryName: String;
   const User: Pointer; const NoSymbolErrors: Boolean): Integer;
 var
-  ErrSym: PLibSymbol;
+  ErrSyms: TLibSymbolPtrArray;
   NewIdent: TLibIdent;
+  I: Integer;
 begin
   if Handler.Filename <> '' then
   begin
@@ -213,9 +217,10 @@ begin
 
     Handler.Filename := LibraryName;
 
-    if not LoadLibrarySymbols(Handler.Handle, Handler.Symbols, Handler.SymCount, @ErrSym) and not NoSymbolErrors then
+    if not LoadLibrarySymbols(Handler.Handle, Handler.Symbols, Handler.SymCount, @ErrSyms) and not NoSymbolErrors then
     begin
-      AppendLibraryError(Handler, Format(SLibraryUnknownSym, [ErrSym^.name, Handler.InterfaceName, LibraryName]));
+      for I := 0 to Length(ErrSyms) - 1 do
+        AppendLibraryError(Handler, Format(SLibraryUnknownSym, [ErrSyms[I]^.name, Handler.InterfaceName, LibraryName]));
       UnloadLibrary(Handler.Handle);
       Handler.Handle := NilHandle;
       Handler.Filename := '';
@@ -344,9 +349,10 @@ begin
 end;
 
 function LoadLibrarySymbols(const Lib: TLibHandle; const Symbols: PLibSymbol; const Count: Integer;
-  const ErrorSym: PPLibSymbol): Boolean;
+  const ErrorSymbols: PLibSymbolPtrArray): Boolean;
 var
   P,L: PLibSymbol;
+  Len: Integer;
 begin
   P := Symbols;
   L := @Symbols[Count];
@@ -355,10 +361,13 @@ begin
     P^.pvar^ := GetProcedureAddress(Lib, P^.name);
     if not Assigned(P^.pvar^) and not P^.weak then
     begin
-      if Assigned(ErrorSym) then
-        ErrorSym^ := P;
+      if Assigned(ErrorSymbols) then
+      begin
+        Len := Length(ErrorSymbols^);
+        SetLength(ErrorSymbols^, Len+1);
+        ErrorSymbols^[Len] := P;
+      end;
       Result := False;
-      Exit;
     end;
     Inc(P);
   end;