Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Событие из DLL в Main Application


cantalia ©   (2007-09-12 11:04:00) 

Как и где объявить функцию, которая происходила бы по нажатию кнопки в DLL(COM Server) и отдавала бы результат клиенту? Кнопка в DLL создаётся динамически.

Функция вида:
function SendAction(act:PChar):HResult; stdcall;
Объявил в DLL и в главном приложении, событие в DLL проходит, но в клиент не доходит.


den303_work   (2007-09-12 14:54:00) [1]


> http://www.podgoretsky.com/ftp/Docs/Delphi/Tenser/2/index2.
> htm

Большое спасибо, изучаю. Вроде то, что нужно


Сергей М.   (2007-09-12 14:37:00) [2]


> Дык это ж не COM!


Дык это ж как ответ на


> А если без COM, просто в библиотечке DLL?



> Я с COM дела не имел, а в ТЗ чётко сказано "СОМ-библиотеку"


> в справке примеров вообще нет


http://www.podgoretsky.com/ftp/Docs/Delphi/Tenser/2/index2.htm


den303_work   (2007-09-12 14:14:00) [3]


> Решение в [4] чем не устроило ?

Дык это ж не COM! Или нормально? Я с COM дела не имел, а в ТЗ чётко сказано "СОМ-библиотеку".


Сергей М.   (2007-09-12 14:07:00) [4]


> Есть ли другие, более простые способы реализации данной
> задачи


Решение в [4] чем не устроило ?


den303_work   (2007-09-12 14:02:00) [5]

К сожалению, времени изучать весь COM не осталось (впервые столкнулся), переписывать проект на ActiveForm не успеваю. Разобрался с коклассами, передачу параметров вdll решил. Осталось передать параметры изdll по событию OnClick на кнопке, расположенной (и в рантайм генерируемой!) на DLL-форме. Не могу додуматься, как генерировать события.
Предложенный Вами EventSink подходит, как я понял, тока для Automation/ActiveForm, либо я опять не пойму, как события объявлять.
Есть ли другие, более простые способы реализации данной задачи, чем дотошно изучить всё, что касается COM?

ЗЫ: Как назло, примеров вообще нет, в справке примеров вообще нет, примеры из поставки D7 совсем не из той области, а книги читать не успеваю....

ЗЫ2: Звиняйте за сумбур :o(


Сергей М.   (2007-09-12 13:46:00) [6]

см. справку на тему "Managing events in your Automation object"


den303_work   (2007-09-12 13:43:00) [7]

Подскажите, плз, как этот TAutoObject.EventSink объявить. В справке написано Property....


Сергей М.   (2007-09-12 13:05:00) [8]


> Хоть один нормальный примерчик с TActiveForm


Ищи среди демо-проектов в составе Делфи, там точно есть.


> является ли ActiveForm (ocx) "внутрипроцессорной COM-библиотекой"


Явлется.


> Имхо, надо dll


ocx и есть dll


cantalia   (2007-09-12 13:01:00) [9]

И вообще, является ли ActiveForm (ocx) "внутрипроцессорной COM-библиотекой" (фраза из ТЗ). Имхо, надо dll...


den303_work   (2007-09-12 12:57:00) [10]


> Сергей М. ©   (12.09.07 12:11) [6]

Хоть один нормальный примерчик с TActiveForm, плз! Все примеры, найденные мной, ипсользуют iExporer. А мне-то надо из приложения вызывать


Сергей М.   (2007-09-12 12:11:00) [11]

Проще всего плясать от TActiveForm (см. справку)


den303_work   (2007-09-12 12:04:00) [12]


> Ты Шиву многоликий ?)

Ага ;o)
На другом форуме под первым ником сижу, вбил по привычке


> 1. Объявляешь тип колбэк-процедуры...

Пасиб, разобрался.

А вот с COM не очень. Есть ли какие простейшие примеры построения COM-объекта с возможностью пересылки сообщений туда-сюда? Весь Яндекс перерыл - ничего не нашёл... :o(

И вообще: надо построить inproc сервер, который строит дочернюю форму. Какой объект использовать? Automation? Или ComServ достаточно?


Сергей М.   (2007-09-12 11:50:00) [13]


> Это я cantalia :o)
> Второй ник
>


Ты Шиву многоликий ?)


> А если без COM, просто в библиотечке DLL?


1. Объявляешь тип колбэк-процедуры

TEventHandler = procedure(Params: TSomeParams); stdcall;

2. Объявляешь и реализуешь экп.процедуру

procedure SetEventHandler(AHandler: TEventHandler); stdcall;
begin
 ExternalHandler := AHandler; //ExternalHandler - переменная (или поле какого-либо подходящего объекта) типа TEventHandler
end;

3. В обработчике нажатия кнопки

if Assigned(@EventHandler) then
 EventHandler(параметры обратного вызова)


den303_work   (2007-09-12 11:36:00) [14]

Это я cantalia :o)
Второй ник


den303_work   (2007-09-12 11:35:00) [15]

Спасибо.
А если без COM, просто в библиотечке DLL?


Сергей М.   (2007-09-12 11:25:00) [16]

см. стандартную справку к св-ву TAutoObject.EventSink


Наверх

Титульная страница Поиск, карта сайта Написать письмо