|
Вопрос # 3 594/ вопрос открыт / |
|
Приветствую, уважаемые эксперты!
Как сделать чтобы DLL с динамической загрузкой выполняла какую-то функцию в программе-хосте?
То есть например в программе:
...
function DoAction(name, data: string): string;
begin
Showmessage('Name: ' + name+ '; Data: '+ data);
Result:='some text here';
end;
...
А в DLL:
...
str := DoAction('DownloadFile', 'http://testfile/');
...
Чтобы появилось сообщение "Name: DownloadFile; Data: http://testfile/" и переменной str в плагине присвоилось 'some text here'
Если можете - сделайте пример...
 |
Вопрос задал: MOZGIII (статус: Посетитель)
Вопрос отправлен: 28 декабря 2009, 00:23
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, MOZGIII!
Есть давно отлаженные механизмы. Например - передача указателя на функцию.
То есть. в основном приложении создаем функцию, которую dll должна вызывать.
Пусть это будет такая
procedure myproc(x:integer);
begin
end;
В dll мы для начала объявим указатель на эту функцию
type TMyProc = procedure(x:integer);//да, такой странный
var myproc:TMyProc = nil;
Теперь надо объявить процедуру, которая инициализирует это дело. В dll объявим экспортируемую процедуру вида
procedure InitDll(pr:TMyProc);
begin
myproc := pr;
end;
Теперь возвращаемся в основное приложение. Там нам надо при загрузке плагина вызвать эту процедуру. Этот вызов выглядит так
InitDll(@MyProc);
Все, теперь можно вызывать.
if @myproc <> nil then myproc(param);
Понятное дело, что если надо передать 2-3 процедуры, то можно просто добавить параметров в InitDll. Если же хочется сотню процедур, то просто заводиться массив или, что лучше, record.
Естественно, что контроль за соблюдением кол-ва параметров и их типах следить надо самому.
Иногда, что бы не плодить тонны функций, можно сделать ещё красивее. для работы надо всего лишь одна процедура. в одном параметре передаем "код функции" - хоть строкой (так даже удобнее, если только строки уметь правильно передавать) или просто целым числом. а второй параметр - это указатель на record, в котором передаются параметры (там же можно и возвращать результаты).
Все вышесказанное относиться и к функциям - с ними все также хорошо работает.
Метод второй использование интерфейсов.
для этого читаем готовую статью http://www.delphikingdom.com/asp/viewitem.asp?catalogid=1338
p.s. FastMM, который вы используете уже включен в 2007 делфи - так что это и так понятно:)
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 28 декабря 2009, 01:57
Оценка за ответ: 5
Комментарий к оценке: Спасибо, я уже сам разобрался... у меня и был на самом деле указатель на процедуру, только ошибку выдавало... а щяс норм... но всё ровно, спасибо за ответ :)
|
Мини-форум вопроса
Всего сообщений: 2; последнее сообщение — 28 декабря 2009, 00:27; участников в обсуждении: 1.
|
MOZGIII (статус: Посетитель), 28 декабря 2009, 00:25 [#1]:
Версия IDE: Delphi 2007
|
|
MOZGIII (статус: Посетитель), 28 декабря 2009, 00:27 [#2]:
Ах да... ещё FastShareMem я использую, если это имеет значение...
|
28 декабря 2009, 13:43: Вопрос перемещён из тематического раздела Delphi » COM, ActiveX и взаимодействие с другими приложениями в раздел Delphi » Работа с компонентами и библиотеками модератором Ерёмин А.А.
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|