Код:
function TPluginManager.GetPluginInterface(Handle: THandle): ISimplePlugin;
var
Func:function : TInterfacedObject;
Obj:TObject;
Info:ISimplePlugin;
begin
DebugLog('[TPluginManager.GetPluginInterface] Поиск функции GetPluginInf');
@Func:=GetProcAddress(Handle,'GetPluginInf');
if @Func<>nil then
begin
Obj:=Func;
DebugLog('[TPluginManager.GetPluginInterface] Функция GetPluginInf нацдена');
if not TInterfacedObject(Obj).GetInterface(ISimplePlugin,Result) then
begin
DebugLog('[TPluginManager.GetPluginInterface] Результат не вернул интерфейс.');
Result:=nil
end
else
DebugLog('[TPluginManager.GetPluginInterface] Результат вернул интерфейс.');
@Func := nil;
end
else
begin
DebugLog('[TPluginManager.GetPluginInterface] Функция GetPluginInf не найдена.');
Result:=nil;
end;
end;
function TPluginManager.RegLib(Handle: THandle;
FileName: WideString): boolean;
var
LibInterface:ISimplePlugin;
Index:Integer;
begin
DebugLog('[TPluginManager.RegLib] Регистрируем библиотеку['+FileName+']');
LibInterface:=GetPluginInterface(Handle);
if LibInterface=nil then
begin
Result:=False;
WarningMsg('[TPluginManager.RegLib] Интерфейс не найден');
Exit;
end;
if VerifyInf(LibInterface) then
try
LibInterface.SetHandle(Handle);
LibInterface.SetPluginFileName(FileName);
Add(LibInterface);
DebugLog('[TPluginManager.RegLib] Зарегестрирована');
Result:=True;
except
Result:=False;
end
end;
Вот. Возможны излишки, но это сделано в результате отладки.