![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Умные плагины в DLL [D7, Win95/98, Win2k, WinXP]
П7 © (2004-08-03 15:49:00)Товарищи!
Нужно, чтобы приложение подгружало плагины, которые затем будут каким-либо образом передавать этому приложению команды. Формат команд произвольны, в принцыпе. Например из окна, хранящегося в DLL нужно будет запустить определённую функцию основной программы, с определёнными параметрами. Например:
GetCommand( 'QUIT' );
Сея команда должна обработаться на основе данных основной формы программы и выполнится.
if ( CurrentCommand = 'QUIT' ) and ( bQuit = true ) then
Application.Terminate();
Но как всё это реализовать? Если из приложения запустить функцию DLL не проблема по умолчанию, то как обстоят дела при обратном подходе к проблеме?
Заранее благодарен.
П7 (2004-08-04 09:49:00) [1]
> PVOzerski © (03.08.04 17:10) [6]
Спасибо, идея прикольная. Нужно будет сейчас поэкспериментировать. Собственно таким образом я сейчас проверяю DLL'ки на плагинность моей проги. Ищется процедура в которую параметром передаётся процедура, которая запускается с параметрами, которые содержат названия всех имеющихся процедур в плагине. Надеюсь не очень запутанно написал... (: А вот использовать тот же механизм для передачи команд как-то не догадался. Одно слово - тормоз!!! (:
PVOzerski (2004-08-03 17:33:00) [2]>Да, но тогда придется регистрировать callback'и в каждой подключаемой dll'ке
А что тут такого страшного? Заодно через GetProcAddress можно проверять, является ли данная dll плагином к этой проге.
Goffman (2004-08-03 17:19:00) [3]
> [6] PVOzerski © (03.08.04 17:10)
Да, но тогда придется регистрировать callback'и в каждой подключаемой dll'ке, хотя если она всего одна...
зы: а про COM я ничего и не говорил :)
PVOzerski (2004-08-03 17:10:00) [4]Да тут можно без всяких COM-технологий обойтись. Просто использовать механизм callback-функций. Пусть программа отдает dll-ке свои callback'и, а уж dll их вызывает. Например, что-то такое:
type
tMyCallBack=function(CmdID:pChar;params:pointer):longbool;stdcall;
procedure AttachCallBack(aCallBack:tMyCallBack);stdcall;
external 'myplugin.dll';
Goffman (2004-08-03 16:46:00) [5]
> [2] П7 (03.08.04 16:23)
Нет, ты понял неправильно, но это и не удивительно, раз ты не знаком с интерфесами.
Поищи соотв. статьи здесь или на королевстве.
Например http://www.delphikingdom.com/asp/viewitem.asp?catalogid=468
П7 (2004-08-03 16:28:00) [6]
> REA © (03.08.04 16:26) [3]
Код, пожалуйста, покажите... (:
REA (2004-08-03 16:26:00) [7]Можно послать сообщение главной форме программы.
П7 (2004-08-03 16:23:00) [8]
> Goffman (03.08.04 16:08) [1]
Можно поподробнее. Я с интерфейсами в Delphi не знаком, каким образом можно будет обратится к функции главной формы программы? Если я правильно понял, то мы имеем некую общую (глобальную) переменную типа функция, присваиваем ей функцию основной формы и пользуемся ей в DLL?
Goffman (2004-08-03 16:08:00) [9]Можно реализовать в главной форме интерфейс, например:
IMyIntf=interface
function DoCommand(cmd:string):integer;
end;
из длл-ки вызываешь
var
myIntf:IMyIntf;
begin
if Application.MainForm.GetInterface(IMyIntf,myIntf) then
myIntf.DoCommand('MY_COMMAND');
end;