|
Вопрос # 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 (статус: Посетитель)
Вопрос отправлен: 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 (статус: Посетитель), 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 (статус: Посетитель), 2 июня 2008, 18:13 [#24]:
конечно, это действительно просто, но у меня проблема с написанием самого класса. я уже не знаю, как это все в дополненном и исправленном состоянии будет выглядеть
|
|
Вадим К (статус: Академик), 2 июня 2008, 18:20 [#25]:
там будет не один, там будет два класса - один - класс для плагина, другой - для списка
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Phoenix (статус: Посетитель), 2 июня 2008, 18:27 [#26]:
а в классе плагина уже будут экспортируюмые функции и процедуры? все-таки их же надо разделять, что б знать какая например функция пренадлежит отдельно взятому плагину
|
|
Вадим К (статус: Академик), 2 июня 2008, 18:31 [#27]:
в классе плагина будет их загрузка.
при надобности вызвать процедуру с плугина просто обращаемся к классу и дёргаем его метод. А он уже сам находит процедуру и вызывает.
или у вас каждый плагин имеет свои процедуры с разными именами?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Phoenix (статус: Посетитель), 2 июня 2008, 18:34 [#28]:
понятно как будет работать этот класс...
у меня все плагины имеют процедуры и функции с одинаковыми именами
|
|
Вадим К (статус: Академик), 2 июня 2008, 18:35 [#29]:
ну тогда нет проблем.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Вадим К (статус: Академик), 3 июня 2008, 03:02 [#30]:
Код написан и ждёт-с в архиве. Комментарии прилагаются.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Phoenix (статус: Посетитель), 3 июня 2008, 15:28 [#31]:
еще один нескромный вопрос: где бы мне этот архивчик достать?
|
|
Вадим К (статус: Академик), 3 июня 2008, 23:10 [#32]:
У меня на диске. Могу выложить в обменник. Пишите в "личные сообщения" - договоримся
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Phoenix (статус: Посетитель), 4 июня 2008, 08:05 [#33]:
ого! ок.
|
31 января 2011, 19:31: Статус вопроса изменён на решённый (изменил модератор Ерёмин А.А.): Автоматическая обработка (2 и более ответов с оценкой 5)
Страницы: [« Предыдущая] [1] [2]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|