mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-21 11:29:24 +02:00
* 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:
parent
0a625c856d
commit
4e39959ca1
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user