|
Вопрос # 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] [Следующая »]
|
Phoenix (статус: Посетитель), 1 июня 2008, 19:06 [#1]:
Вадим, с нулем опечатка!! неужели придется использовать массив хендлов?
что-то типа:
var
plugs : array of THandle;
//...............................
for i:=0 to pluglist.count-1 do begin
plugs[i]:= LoadLibrary(pchar(pluglist.Strings[i]));
//...............................
вот только вопрос: обязательно ли нужно определять границы массива?
plugs [0..9] : array of THandle;
//очень плохо, т.к. плагинов с списке может быть больше!
Если обязательно, то можно ли ввети динамический массив? что-то типа:
SetLength(plugs, pluglist.count); //нехорошо!
и вопрос на засыпку: можно ли использовать динамические массивы в DLL?
|
|
Phoenix (статус: Посетитель), 1 июня 2008, 19:18 [#2]:
и еще, как это я не подумал написав, выходит надо ввести массив функций (!) а такое не возможно?
а хендл использовать один и очищать после каждого плагина FreeLibrary(Handle);
-----------------------
PlugLoad : array of function(mes:string):pchar //смешно даже
//даже не представляю как это будет выглядеть
PlugLoad[i]('приивет'); //катаюсь по полу
|
|
Phoenix (статус: Посетитель), 1 июня 2008, 19:23 [#3]:
тьфу, перепутал все...
@proc1:= GetProcAddress(plug[i],'proc1'); ТАК*?
это выглядит не так глупо как моё предыдущее сообшщение
|
|
Phoenix (статус: Посетитель), 1 июня 2008, 19:28 [#4]:
нет, действительно надо вводить массив функций, пердыдущее моё сообщение не спасает положение я в тупике....
|
|
Вадим К (статус: Академик), 1 июня 2008, 19:57 [#5]:
Я бы на вашем месте создал структуру (а лучше класс), который будет инкапсулировать в себя длл. То есть, там будет и хендл, и объёртка для процедур.
А потом для всего этого динамический массив (а ещё лучше - класс-наследник TList).
Скрыв таким образом всю "внутреннюю кухню", вы лишитесь всех проблем.
Массив без границ можно объявлять, это динамический массив.
Но для него надо использовать SetLength и выставлять размеры.
Но эту функцию можно применять к массиву много раз и менять размер.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Phoenix (статус: Посетитель), 1 июня 2008, 20:11 [#6]:
ого! половину ваших терминов я не понял... до создания классов я еще не дорос, поэтому как не постараюсь, такое чудо не смастерю. НУ ладно, спасибо и на этом, может придётся и отказаться от всего, т.к. не вижу способа реализации.
|
|
Вадим К (статус: Академик), 1 июня 2008, 20:43 [#7]:
Кода то там на один юнит. главное взяться. попробуйте на основе record и массивов
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Phoenix (статус: Посетитель), 1 июня 2008, 20:50 [#8]:
конечно ж попробую, только у меня ж опыта в таких делах нет, буду ковыряться, в итоге - ничего!
|
|
Вадим К (статус: Академик), 1 июня 2008, 21:25 [#9]:
Тогда надо читать книжжки, статьи, пробовать разбить задачу на более простые и по мере надобности формулировать вопросы.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Phoenix (статус: Посетитель), 2 июня 2008, 14:27 [#10]:
делаю вот так, создаю класс:
type
TPlugs = class
private
NazvPluga : String;
HandlPluga : Thandle;
public
property PlugName : String
read NazvPluga;
property PlugHandle : THandle
read HandlPluga;
constructor Create(const NazvPluga : String;
const HandlPluga : Thandle);
end;
//обязательно
spisok:TList
далее завожу динамический массив THandlе'ов - masshand, определяю размер:
SetLength(massplugs, pluglist.count);
//при этом pluglist заполняется ранее. потом в цикле заполняется spisok:
for i:=0 to pluglist.count-1 do begin
spisok.Add(TPlugs.Create(pluglist.Strings[i], masshand[i]));
//далее грузим в хэндл плуг, в том же цикле:
TPlugs(spisok[i]).PlugHandle:=LoadPlugin(TPlugs(spisok[i]).PlugName);
//далее допустим, что мы создали список процедурами и список с функциями procspisok, funcspisok:
//все в том же цикле определяем:
при этом класс процедурTProc имеет 2 поля-свойства - имя функции (name:string) и саму процедуру (procdura:procedure)
TProc(procspisok[i]).procdura:= GetProcAddress(TPlugs(spisok[i]).PlugHandle,TProc(procspisok[i]).name);
//далее тоже самое с функциями
end;
кажется слишком громоздко получается? да и кое-что не сходится! прошу поправить
|
|
Вадим К (статус: Академик), 2 июня 2008, 15:20 [#11]:
а зачем массив хендлов заводить? и пусть класс только получает имя плугина(имя файла) и сам уже лезит, загружает. Хендл длл должен быть скрыт внутри класса - другим он не надо.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Phoenix (статус: Посетитель), 2 июня 2008, 15:48 [#12]:
насколько я знаю, для того чтобы скрыть поле класса, надо добавить его в секцию private,так?
TPlugs = class
private
HandlPluga : Thandle;
property PlugHandle : THandle
read HandlPluga;
protected
public
NazvPluga : String;
property PlugName : String
read NazvPluga;
constructor Create(const NazvPluga : String;const HandlPluga : Thandle);
end;
|
|
Вадим К (статус: Академик), 2 июня 2008, 16:23 [#13]:
приватные свойства делать не нужно
protect лучше перевести в public - иначе доступа к ним не видать
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Phoenix (статус: Посетитель), 2 июня 2008, 16:30 [#14]:
понятно, а как же быть с конструктором? spisok.Add(TPlugs.Create(pluglist.Strings[i], XXXXXXX));
XXXXXXX - тут должно быть хэндл:cardinal, откуда его взять? если не заводить массив хэндлов?
|
|
Вадим К (статус: Академик), 2 июня 2008, 16:39 [#15]:
а не надо хендл передвать!
пусть класс сам подгрузит библиотеку.
и pluglist тоже не надо.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Phoenix (статус: Посетитель), 2 июня 2008, 16:44 [#16]:
=)) вконец запутался я...
pluglist - это список плагинов, он нужен, для того чтоб выпонить цикл загрузки плагинов. похоже, я не понимаю самой идеи. может в класс надо вводить процедуру загрузки?
|
|
Вадим К (статус: Академик), 2 июня 2008, 16:58 [#17]:
в цикле ищем длл и для каждой найденной, создаём объект и передаем имя. А в конструкторе выполняем загрузку, анализ длл.
и получается, что список уже не надо. Зачем дублировать инфу.
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Phoenix (статус: Посетитель), 2 июня 2008, 17:11 [#18]:
да если и дублировать, все-равно нет материала для разбора. конкретнее мне все это не представить.
|
|
Вадим К (статус: Академик), 2 июня 2008, 17:13 [#19]:
в чём конкретно проблема? в том, что бы правильно разделить код?
Галочка "подтверждения прочтения" - вселенское зло.
|
|
Phoenix (статус: Посетитель), 2 июня 2008, 17:14 [#20]:
а вообще есть более простые методы решения такой довольно специфической задачи? неужели кроме меня никто с таким не сталкивался?
|
Страницы: [1] [2] [Следующая »]
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|