Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];

Вниз

Умные плагины в DLL   Найти похожие ветки 

 
П7   (2004-08-03 15:49) [0]

Товарищи!
Нужно, чтобы приложение подгружало плагины, которые затем будут каким-либо образом передавать этому приложению команды. Формат команд произвольны, в принцыпе. Например из окна, хранящегося в DLL нужно будет запустить определённую функцию основной программы, с определёнными параметрами. Например:

GetCommand( "QUIT" );

Сея команда должна обработаться на основе данных основной формы программы и выполнится.

if ( CurrentCommand = "QUIT" ) and ( bQuit = true ) then
 Application.Terminate();

Но как всё это реализовать? Если из приложения запустить функцию DLL не проблема по умолчанию, то как обстоят дела при обратном подходе к проблеме?

Заранее благодарен.


 
Goffman   (2004-08-03 16:08) [1]

Можно реализовать в главной форме интерфейс, например:
IMyIntf=interface
 function DoCommand(cmd:string):integer;
end;


из длл-ки вызываешь
var
 myIntf:IMyIntf;
begin
 if Application.MainForm.GetInterface(IMyIntf,myIntf) then
   myIntf.DoCommand("MY_COMMAND");
end;


 
П7   (2004-08-03 16:23) [2]


> Goffman   (03.08.04 16:08) [1]

Можно поподробнее. Я с интерфейсами в Delphi не знаком, каким образом можно будет обратится к функции главной формы программы? Если я правильно понял, то мы имеем некую общую (глобальную) переменную типа функция, присваиваем ей функцию основной формы и пользуемся ей в DLL?


 
REA ©   (2004-08-03 16:26) [3]

Можно послать сообщение главной форме программы.


 
П7   (2004-08-03 16:28) [4]


> REA ©   (03.08.04 16:26) [3]

Код, пожалуйста, покажите... (:


 
Goffman   (2004-08-03 16:46) [5]


> [2] П7   (03.08.04 16:23)

Нет, ты понял неправильно, но это и не удивительно, раз ты не знаком с интерфесами.
Поищи соотв. статьи здесь или на королевстве.
Например http://www.delphikingdom.com/asp/viewitem.asp?catalogid=468


 
PVOzerski ©   (2004-08-03 17:10) [6]

Да тут можно без всяких 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 17:19) [7]


> [6] PVOzerski ©   (03.08.04 17:10)


Да, но тогда придется регистрировать callback"и в каждой подключаемой dll"ке, хотя если она всего одна...

зы: а про COM  я ничего и не говорил :)


 
PVOzerski ©   (2004-08-03 17:33) [8]

>Да, но тогда придется регистрировать callback"и в каждой подключаемой dll"ке

А что тут такого страшного? Заодно через GetProcAddress можно проверять, является ли данная dll плагином к этой проге.


 
П7   (2004-08-04 09:49) [9]


> PVOzerski ©   (03.08.04 17:10) [6]

Спасибо, идея прикольная. Нужно будет сейчас поэкспериментировать. Собственно таким образом я сейчас проверяю DLL"ки на плагинность моей проги. Ищется процедура в которую параметром передаётся процедура, которая запускается с параметрами, которые содержат названия всех имеющихся процедур в плагине. Надеюсь не очень запутанно написал... (: А вот использовать тот же механизм для передачи команд как-то не догадался. Одно слово - тормоз!!! (:



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.08.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.045 c
1-1091774644
yozh_programmer
2004-08-06 10:44
2004.08.22
Как проскролить фрейм?


11-1079715719
nester
2004-03-19 20:01
2004.08.22
Как убрать заголовки страниц в TabControl?


14-1091564102
Alex_Bredin
2004-08-04 00:15
2004.08.22
Рыбалка


1-1091691966
Alek
2004-08-05 11:46
2004.08.22
UTF-8


4-1089291960
дурень
2004-07-08 17:06
2004.08.22
изменения на диске включая подкоталоги.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский