Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: 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

MOZGIII (статус: Посетитель), 28 декабря 2009, 00:25 [#1]:

Версия IDE: Delphi 2007
MOZGIII

MOZGIII (статус: Посетитель), 28 декабря 2009, 00:27 [#2]:

Ах да... ещё FastShareMem я использую, если это имеет значение...

28 декабря 2009, 13:43: Вопрос перемещён из тематического раздела Delphi » COM, ActiveX и взаимодействие с другими приложениями в раздел Delphi » Работа с компонентами и библиотеками модератором Ерёмин А.А.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:35
Выполнено за 0.03 сек.