Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 1 642

/ вопрос решён /

Здравствуйте, уважаемые эксперты!
Снова работаю с плагинами, мне необходимо реализовать динамическую загрузку сразу нескольких плагинов!
Мой вариант "в цикле" как видно провальный, мне не хватает опыта для реализации данной идеи.

for i:=0 to pluglist.count-1 do begin
PlugHandle := LoadLibrary(pchar(pluglist.Strings[0]));
if PlugHandle<>0 then begin
@proc1 := GetProcAddress(plugHandle,'proc1');
@proc2:= GetProcAddress(plugHandle,'proc2');
@func1 := GetProcAddress(plugHandle,'func1');
@func2:= GetProcAddress(plugHandle,'func2');
//функции используются в других процедурах...
if @proc1 <> nil then
proc1;
if @proc2 <> nil then
proc2;
end;
end;

Вот такая белиберда. Выходит так, что грузится только последний плугин из списка. Как загрузить все плагины из списка сразу (я имею ввиду все процедуры и функции, содержащиеся в каждом)? Догадываюсь надо иметь кучу переменных proc1Х, чтобы хранить все функции... Надеюсь на помощь!

Phoenix Вопрос решён, но можно продолжить его обсуждение в мини-форуме

Вопрос задал: Phoenix (статус: Посетитель)
Вопрос отправлен: 1 июня 2008, 17:51
Состояние вопроса: решён, ответов: 2.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, Phoenix!
Ну а вся заковырка в этой строке PlugHandle := LoadLibrary(pchar(pluglist.Strings[0]));
вы всегда грузите только первый файл, не важно, сколько их там. Попробуйте заменить на PlugHandle := LoadLibrary(pchar(pluglist.Strings[i]));
А также, возможно, после загрузки надо добавить выгрузку с помощью FreeLibrary или заводьте массив для хендлов плугинов.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 1 июня 2008, 18:33
Оценка за ответ: 5

Комментарий к оценке: Спасибо, очень прошу глянуть сообщение на мини-форуме вопроса

Ответ #2. Отвечает эксперт: min@y™

В дополнение к ответу Вадима К.

Цитата:

А также, возможно, после загрузки надо добавить выгрузку с помощью FreeLibrary или заводьте массив для хендлов плугинов.


Хэндлы удобнее хранить в классе TList, откуда их в цикле извлекать для FreeLibrary(). Адреса функций ProcX и FuncX тоже можно хранить в соответствующих экземплярах TList.

Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 2 июня 2008, 08:19
Оценка за ответ: 5

Комментарий к оценке: отлично, как это я сразу не додумался, попробую

Мини-форум вопроса

Всего сообщений: 33; последнее сообщение — 4 июня 2008, 08:05; участников в обсуждении: 2.

Страницы: [« Предыдущая] [1] [2]

Вадим К

Вадим К (статус: Академик), 2 июня 2008, 17:24 [#21]:

я написал наиболее правдоподобный вариант решения.
Галочка "подтверждения прочтения" - вселенское зло.
Phoenix

Phoenix (статус: Посетитель), 2 июня 2008, 17:46 [#22]:

вот что-то мне не охватить этот вариант... давайте сначала и по порядку:
1) я имею список путей к ДЛЛ
2) в цикле находим каждую, в конструкторе загружаем ее (вот только мало себе представляю это извращенное действо)
3) далее уже вообше не представляю....
в итоге все опять сводится к белиберде в моём вопросе.
Вадим К

Вадим К (статус: Академик), 2 июня 2008, 17:56 [#23]:

цикл будет выглядель где то так. (код схематический!!!)
if findfirst(fs,...) then
repeat
Plugins.add(fs.name);
until findnext<>0
findclose
теперь осталось список сделать. здесь тоже просто
но это я уже дома смогу написать.
Галочка "подтверждения прочтения" - вселенское зло.
Phoenix

Phoenix (статус: Посетитель), 2 июня 2008, 18:13 [#24]:

конечно, это действительно просто, но у меня проблема с написанием самого класса. я уже не знаю, как это все в дополненном и исправленном состоянии будет выглядеть
Вадим К

Вадим К (статус: Академик), 2 июня 2008, 18:20 [#25]:

там будет не один, там будет два класса - один - класс для плагина, другой - для списка
Галочка "подтверждения прочтения" - вселенское зло.
Phoenix

Phoenix (статус: Посетитель), 2 июня 2008, 18:27 [#26]:

а в классе плагина уже будут экспортируюмые функции и процедуры? все-таки их же надо разделять, что б знать какая например функция пренадлежит отдельно взятому плагину
Вадим К

Вадим К (статус: Академик), 2 июня 2008, 18:31 [#27]:

в классе плагина будет их загрузка.
при надобности вызвать процедуру с плугина просто обращаемся к классу и дёргаем его метод. А он уже сам находит процедуру и вызывает.

или у вас каждый плагин имеет свои процедуры с разными именами?
Галочка "подтверждения прочтения" - вселенское зло.
Phoenix

Phoenix (статус: Посетитель), 2 июня 2008, 18:34 [#28]:

понятно как будет работать этот класс...
у меня все плагины имеют процедуры и функции с одинаковыми именами
Вадим К

Вадим К (статус: Академик), 2 июня 2008, 18:35 [#29]:

ну тогда нет проблем.
Галочка "подтверждения прочтения" - вселенское зло.
Вадим К

Вадим К (статус: Академик), 3 июня 2008, 03:02 [#30]:

Код написан и ждёт-с в архиве. Комментарии прилагаются.
Галочка "подтверждения прочтения" - вселенское зло.
Phoenix

Phoenix (статус: Посетитель), 3 июня 2008, 15:28 [#31]:

еще один нескромный вопрос: где бы мне этот архивчик достать?
Вадим К

Вадим К (статус: Академик), 3 июня 2008, 23:10 [#32]:

У меня на диске. Могу выложить в обменник. Пишите в "личные сообщения" - договоримся
Галочка "подтверждения прочтения" - вселенское зло.
Phoenix

Phoenix (статус: Посетитель), 4 июня 2008, 08:05 [#33]:

ого! ок.

31 января 2011, 19:31: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)

Страницы: [« Предыдущая] [1] [2]

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 26 апреля 2026, 01:07
Выполнено за 0.03 сек.