* 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 -
This commit is contained in:
ivost 2010-10-30 20:49:12 +00:00
parent 0a625c856d
commit 4e39959ca1

View File

@ -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;