mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-16 00:09:17 +02:00
parent
a7f746e81b
commit
5604937bd4
@ -64,6 +64,9 @@ type
|
|||||||
TLibEventLoading = function(User: Pointer; Handler: PLibHandler): Boolean;
|
TLibEventLoading = function(User: Pointer; Handler: PLibHandler): Boolean;
|
||||||
TLibEventUnloading = procedure(Handler: PLibHandler);
|
TLibEventUnloading = procedure(Handler: PLibHandler);
|
||||||
|
|
||||||
|
TLibIdent = QWord;
|
||||||
|
TLibIdentGetter = function(const Filename: String): TLibIdent;
|
||||||
|
|
||||||
PPLibSymbol = ^PLibSymbol;
|
PPLibSymbol = ^PLibSymbol;
|
||||||
PLibSymbol = ^TLibSymbol;
|
PLibSymbol = ^TLibSymbol;
|
||||||
TLibSymbol = record
|
TLibSymbol = record
|
||||||
@ -75,10 +78,12 @@ type
|
|||||||
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 }
|
||||||
Filename : String; { handle of the current loaded library }
|
Filename : String; { filename of the current loaded library }
|
||||||
Handle : TLibHandle; { filename of the current loaded library }
|
Handle : TLibHandle; { handle of the current loaded library }
|
||||||
Loading : TLibEventLoading; { loading event, called after the unit is loaded }
|
Loading : TLibEventLoading; { loading event, called after the unit is loaded }
|
||||||
Unloading : TLibEventUnloading; { unloading event, called before the unit is unloaded }
|
Unloading : TLibEventUnloading; { unloading event, called before the unit is unloaded }
|
||||||
|
IdentGetter : TLibIdentGetter;
|
||||||
|
Ident : TLibIdent; { crc Ident of the current loaded library }
|
||||||
SymCount : Integer; { number of symbols }
|
SymCount : Integer; { number of symbols }
|
||||||
Symbols : PLibSymbol; { symbol address- and namelist }
|
Symbols : PLibSymbol; { symbol address- and namelist }
|
||||||
ErrorMsg : String; { last error message }
|
ErrorMsg : String; { last error message }
|
||||||
@ -89,7 +94,7 @@ type
|
|||||||
{ handler definition }
|
{ handler definition }
|
||||||
function LibraryHandler(const InterfaceName: String; const DefaultLibraries: array of String;
|
function LibraryHandler(const InterfaceName: String; const DefaultLibraries: array of String;
|
||||||
const Symbols: PLibSymbol; const SymCount: Integer; const AfterLoading: TLibEventLoading = nil;
|
const Symbols: PLibSymbol; const SymCount: Integer; const AfterLoading: TLibEventLoading = nil;
|
||||||
const BeforeUnloading: TLibEventUnloading = nil): TLibHandler;
|
const BeforeUnloading: TLibEventUnloading = nil; const IdentGetter: TLibIdentGetter = nil): TLibHandler;
|
||||||
|
|
||||||
{ initialization/finalization }
|
{ initialization/finalization }
|
||||||
function TryInitializeLibrary(var Handler: TLibHandler; const LibraryNames: array of String;
|
function TryInitializeLibrary(var Handler: TLibHandler; const LibraryNames: array of String;
|
||||||
@ -153,7 +158,7 @@ End;
|
|||||||
|
|
||||||
function LibraryHandler(const InterfaceName: String; const DefaultLibraries: array of String;
|
function LibraryHandler(const InterfaceName: String; const DefaultLibraries: array of String;
|
||||||
const Symbols: PLibSymbol; const SymCount: Integer; const AfterLoading: TLibEventLoading;
|
const Symbols: PLibSymbol; const SymCount: Integer; const AfterLoading: TLibEventLoading;
|
||||||
const BeforeUnloading: TLibEventUnloading): TLibHandler;
|
const BeforeUnloading: TLibEventUnloading; const IdentGetter: TLibIdentGetter): TLibHandler;
|
||||||
var
|
var
|
||||||
I: Integer;
|
I: Integer;
|
||||||
begin
|
begin
|
||||||
@ -162,6 +167,8 @@ begin
|
|||||||
Result.Handle := NilHandle;
|
Result.Handle := NilHandle;
|
||||||
Result.Loading := AfterLoading;
|
Result.Loading := AfterLoading;
|
||||||
Result.Unloading := BeforeUnloading;
|
Result.Unloading := BeforeUnloading;
|
||||||
|
Result.IdentGetter := IdentGetter;
|
||||||
|
Result.Ident := 0;
|
||||||
Result.SymCount := SymCount;
|
Result.SymCount := SymCount;
|
||||||
Result.Symbols := Symbols;
|
Result.Symbols := Symbols;
|
||||||
Result.ErrorMsg := '';
|
Result.ErrorMsg := '';
|
||||||
@ -176,12 +183,22 @@ function TryInitializeLibraryInternal(var Handler: TLibHandler; const LibraryNam
|
|||||||
const User: Pointer; const NoSymbolErrors: Boolean): Integer;
|
const User: Pointer; const NoSymbolErrors: Boolean): Integer;
|
||||||
var
|
var
|
||||||
ErrSym: PLibSymbol;
|
ErrSym: PLibSymbol;
|
||||||
|
NewIdent: TLibIdent;
|
||||||
begin
|
begin
|
||||||
if (Handler.Filename <> '') and (Handler.Filename <> LibraryName) then
|
if Handler.Filename <> '' then
|
||||||
begin
|
begin
|
||||||
AppendLibraryError(Handler, Format(SLibraryAlreadyLoaded, [Handler.InterfaceName, Handler.Filename]));
|
if Assigned(Handler.IdentGetter) then
|
||||||
Result := -1;
|
begin
|
||||||
Exit;
|
NewIdent := Handler.IdentGetter(LibraryName);
|
||||||
|
if NewIdent <> Handler.Ident then
|
||||||
|
begin
|
||||||
|
AppendLibraryError(Handler, Format(SLibraryAlreadyLoaded, [Handler.InterfaceName, Handler.Filename]));
|
||||||
|
Result := -1;
|
||||||
|
Exit;
|
||||||
|
end;
|
||||||
|
end else
|
||||||
|
if IsConsole then
|
||||||
|
WriteLn(Format(SLibraryAlreadyLoaded, [Handler.InterfaceName, Handler.Filename]));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Result := InterlockedIncrement(Handler.RefCount);
|
Result := InterlockedIncrement(Handler.RefCount);
|
||||||
@ -218,6 +235,11 @@ begin
|
|||||||
Result := -1;
|
Result := -1;
|
||||||
Exit;
|
Exit;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
if Assigned(Handler.IdentGetter) then
|
||||||
|
Handler.Ident := Handler.IdentGetter(Handler.Filename)
|
||||||
|
else
|
||||||
|
Handler.Ident := 0;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -292,6 +314,7 @@ begin
|
|||||||
UnloadLibrary(Handler.Handle);
|
UnloadLibrary(Handler.Handle);
|
||||||
Handler.Handle := NilHandle;
|
Handler.Handle := NilHandle;
|
||||||
Handler.Filename := '';
|
Handler.Filename := '';
|
||||||
|
Handler.Ident := 0;
|
||||||
end else
|
end else
|
||||||
if Result < 0 then
|
if Result < 0 then
|
||||||
Handler.RefCount := 0;
|
Handler.RefCount := 0;
|
||||||
|
Loading…
Reference in New Issue
Block a user