Доброго времени суток
Для начала приведу исходный код потом буду задавать вопрос
Код:
TPluginManager = class(TInterfaceList,IPluginManager);
...
function TPluginManager.LoadLib(const FileName:String;var Handle:THandle) : boolean;
var
LibHandle:THandle;
begin
LibHandle := LoadLibrary(PChar(FileName));
if LibHandle = 0 then Result:=False
else
Result:=RegLib(LibHandle,FileName);
Debug('[TPluginManager.RegLib] Библиотека ['+FileName+'] загружена');
end;
RegLib добавляет интерфейс в список и заполняет ещё пару свойств интерфейсов.
Для теста корректности написал функцию выгрузки, которая по нажатию на кнопку должна была выгружать библиотеки(Интерфейсы библиотек ни кем не используются.)
Выгружаю приблизительно так :
Код:
procedure TPluginManager.UnloadAllLibs;
var
Index:Integer;
HWD:THandle;
begin
Debug('[TPluginManager.UnloadAllLibs] Выгружаем библиотеки');
HWD:=ISimplePlugin(Items[0]).GetHandle;
Delete(0);
if FreeLibrary(HWD) then ShowMessage('Вігрузили')
else ShowMessage('Ошибка');
end;
Нулевой элемент существует, проверено.
Элемент ноль подставлен для тестирования а вообще выгрузка идет в цикле.
Запускаю выгрузку с формы на нажатию кнопки:
Код:
procedure TMainAppForm.Button2Click(Sender: TObject);
var
V:IPluginManager;
begin
ShowMessage('=====');
V:=FEngine.GetPluginManger; // Возвращает IPluginManager(TPluginManager)
V.UnloadAllLibs;
ShowMessage('----');
end;
Админ: Пользуемся тегами для оформления кода!
В результате После нажатия кнопки я получаю (после всех ShowMessage и записей в журнал) Access Violation. Delphi указывает на строку выделенную жирным шрифтом в последнем листинге.
При том что функция UnloadAllLibs полностью выполняется (проверено дебаг сообщениями стоящими после begin и перед end);
Такое впечатление что когда делается FreeLibrary(HWD) приложение не знает адрес возврата из функции
Вообщем вопрос прост что за хрен или как ровнять руки ?
PS : Не знал куда отнести свой вопрос,потому написал в эту ветку. Писал на Pascal,Delphi,C,C++,ASM но не профессионально потому считаю себя новичком
