瀏覽代碼

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