Тема: COM-сервер на Дельфи

Здравствуйте.
Создал COM-сервер на Дельфи.
Вызываю приложение-сервер их ЛИСП программы. Каким образом отловить событие нажатия кнопки на форме сервера-приложения, чтобы корректно завершить исполнение сервера - приложения и уничтожить COM-объект.

Re: COM-сервер на Дельфи

минута молчания?

Re: COM-сервер на Дельфи

А твой сервер реализует посылку событий ?

Re: COM-сервер на Дельфи

На фига "посылка событий". При запуске COM-сервера AutoCAd ждет его завершения. Возьми любую книжку - там все написано.

Re: COM-сервер на Дельфи

м-да, действительно первоначально не въехал в суть впроса...
но(!!!) AutoCad будет ждать лишь в том случае если COM-сервер откроет свое окно в модальном режиме...

Re: COM-сервер на Дельфи

но(!!!) AutoCad будет ждать лишь в том случае если COM-сервер откроет свое окно в модальном режиме...

естественно

Re: COM-сервер на Дельфи

COM-сервер не обязательно должен иметь окно. В нем могут быть и просто спрятаны, например, обращения к каким-то функциям. AutoCAD будет ждать завершения запрошенного метода. В частных случаях с модальным окном это закрытие окна.

Re: COM-сервер на Дельфи

да, с модальными все просто,
а если хочется иметь немодальное окно ?...
.
и где наш вопрошающий... чего ему-то хочется ?...

Re: COM-сервер на Дельфи

> callisto
>а если хочется иметь немодальное окно
Ну, немодальное окно сделать просто и вы наверняка знаете как. Хочется ведь, чтобы из немодального окна, типа Tools Palette управлять Автокадом?
COM-сервер может запустить немодальный диалог из дургой DLL и отрапортовать о завершении работы. Автокад освободится, и уже ему можно из немодального диалога посылать указания, как из приложения. Тут могут быть подводные камни, как и при управлении Автокадом из внешней программы. Подобные приемы лучше применять используя ARX. При этом ARX на C++ может вызывать функции из Delphi-dll. ARX откомпилирован один раз, DLL можно менять по необходимости.

Re: COM-сервер на Дельфи

согласен.
но реализацию взаимодействия немодального окна, общающегося с Acad-ом можно реализовать даже на VBA, для этого нужен класс-обертка для нужного COM-сервера, чтобы "ловить" необходимые события.
зы. у меня такое уже работает.

Re: COM-сервер на Дельфи

Народ, у меня проблема с окнами.
Есть функция, вызывающая модальное окно, реализовано в СОМ-сервере, причем сом-сервер - ехе-зшик (не помню как такой называется) и у него есть свое (базовое) окно, в котором разная информация отладочного характера и логи.
Так вот, вызываю функцию запуска модального окна и хочу, что-бы оно было на поле АвтоКАДа. Как например ALERT-диалог. Для этого посылаю в функцию СОМ-сервера Хэндл окна АвтоКАД-а. В самом сервере реализую следующее:

  application.Handle:=AutoCADHandle;
  frm_SetParamDoc:=Tfrm_SetParamDoc.Create(application)
  if frm_SetParamDoc.ShowModal=1 then begin
...

И получается, что окно есть на поле чертежа, но если его двигать, то получается не приятно. Затирает все.
Значит вопрос: 1. Как запускать модальные окна правильно?
2. Если СОМ-сервер свернут, то окно не показывается, как добиться что-бы выводилось?

Re: COM-сервер на Дельфи

(COM-сервер в exe - внешний)
интересное поведение.
но, скорее всего, некорректно хэндлу своего приложения (exe) присваивать хэндл Acad-а, я не силен в win32, но видимо поисходит какая-то хрень...  два(!) процесса имеют один хэндл.
в этом случае, ИМХО, Acad просто висит - т.к. открыто модальное окно, как бы его процесса, а не прорисовывает потому, что за прорисовку того что находится за модальным окном, на самом деле, отвечает другое приложение - окно COM-сервера.
в случае с COM-серверами на DLL - это все корректно работает.
зы. а если создавать модальное окно с вызовом Create(nil)  ?

Re: COM-сервер на Дельфи

Попробовал просто Create(nil).
Все равно перерисовки нету и зависит на прямую от того свернуто основное окно СОМ-сервера или нет. При создании окна можно задать свойство, что бы оно было не свернуто?
Можно-ли коррекно работать не с модальным окном? Как?

Re: COM-сервер на Дельфи

корректно работать можно и с модальным и с немодальным окном.
не надо присваивать хэндлу своего приложения хэндл acad-а - модальное окошко и так будет поверх всех окон висеть;
а в случае с немодальным - надо свойству окна (диалога) FormStyle присвоить fsStayOnTop

Re: COM-сервер на Дельфи

А как сделать, что-бы АвтоКАД перерисовывал область за модальным окном?

Re: COM-сервер на Дельфи

попробовал я вызвать модальный диалог из COM-сервера.EXE - действительно, присутствует такая хрень.
а чем обусловлено использование COM-сервера.EXE  ?
может можно переписать это в DLL ?

Re: COM-сервер на Дельфи

На текущий момент проще переписать в ДЛЛ, но хотелось-бы узнать принципы.
С другой стороны можно оставить все как есть.

Re: COM-сервер на Дельфи

а, черт знает их принципы...  :)
не силен я в win32, но мысли такие:
если COM-сервер в EXE, то модальное окно зависит от процесса COM-сервера, соответственно и за прорисовку заоконного пространства отвечает сам COM-сервер,
а акад просто ждет завершения вызова, и на прорисовку реагировать не должен, потому как в его процессе никаких окошек не двигается.