|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
||||
|
||||
Сервер автоматизации
Уважаемые форумчане!
Экспериментирую с COM, хочу создать приложение - сервер автоматизации по типу MS WORD. По типу имею ввиду саму конструкцию, т.е. есть один главный объект автоматизации Word.Application который в своих свойствах передает интерфейсы на другие внутрипроцессорные объекты автоматизации, есть главная форма на которой реализуется функционал программы и все это находится в dll. Для запуска такого приложения используется приложение "стартер" с несколькими строками кода. Код:
CoInitialize(nil) ; app:=createoleobject('Word.Application'); app.Visible:=true; CoUnInitialize; "стартер"(приложение-клиент) запускает приложение-сервер, само завершается а приложение-сервер остается работать. я создал ActiveX library в нее добавил объект автоматизации Applc в методе TApplc.Initialize делаю так Form1:=TForm1.Create(nil); Form1.Show; форма появляется, но при закрытии стартера(клиента) закрывается и сервер вместе с формой. Что то не так с Instancing и ThreadingModel? Какие только варианты не пробовал. Как вообще реализуется такая схема? Точнее как заставить сервер работать после завершения приложения клиента ("стартера") и куда и как правильно засунуть форму? |
#2
|
|||
|
|||
Потому что ты создал In-Proc сервер, а тебе нужен Out-Proc.
Т.е. у тебя должно быть 2 разных проекта. Один - сервер. Самостоятельне приложение. Второй - твой стартер. |
#3
|
||||
|
||||
а как сделать так чтобы сервер оставался работать после закрытия клиента?
создаю новое приложение Server с формой добавляю объект автоматизации Appl регистрирую создаю клиента - консольное приложение в котором app:=createoleobject('Server.Appl'); окно сервера появляется и сразу закрывается так как закрывается консольное приложение а если сделать app:=createoleobject('Word.Application'); appl.visible:=true то после закрытия клиента ворд продолжает работать уверен ответ элементарный но я его не вижу |
#4
|
|||
|
|||
|
#5
|
||||
|
||||
http://www.blong.com/Articles/Automa...Automation.htm
Да. Спасибо. Это почти то. В примере маленький outproc сервер передает клиенту в единственной своей функции текущее время а тот печатает его в своем заголовке. Но все равно как и у меня при закрытии клиента останавливается и сервер. В общем цели можно достичь если перекрыть у своего объекта автоматизации метод ObjRelease например так.. Код:
function TAppl.ObjRelease: Integer; begin _AddRef; result:=inherited ObjRelease; end; Последний раз редактировалось a.n.d.r.e.w, 10.07.2016 в 13:53. |