| 
| 
 | Вопрос # 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 » Работа с компонентами и библиотеками модератором Ерёмин А.А. Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |