Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.06.24;
Скачать: CL | DM;

Вниз

COM-сервер   Найти похожие ветки 

 
GanibalLector ©   (2005-12-11 13:54) [0]

Не так часто я делаю СОМ-сервера.Посему и вопросы ;)
Итак,написал я сервер...вызываю его поздним связывание.

var Q:Variant;
I,II:Integer;
Code,Name,Bar,Dept:String;
begin
 Q:=CreateOleObject("T2k.Alk");
 try
   Q.Port:=StrToInt(Combobox1.Text);
   Q.Baud:=StrToInt(Combobox2.Text);
   // и так далее
   I:=Q.GetSales(StrToInt(Edit1.Text),StrToInt(Edit2.Text));
 finally
   Q:=UnAssigned;
 end;
 MessageDlg(IntToStr(I),MtInformation,[MbOk],0);

Как по мне,мой сервер должен отработать,ЗАВЕРШИТЬСЯ и только потом должно появиться сообщение с результатом. На самом же деле,он не завершается и сообщение появляется на "втором" фоне т.е. приходится закрывать окно сервера.Я так понимаю,что  необходимо создать какой-то метод Quit. Но что в нем писать???


 
Набережных С. ©   (2005-12-11 15:44) [1]


> GanibalLector ©   (11.12.05 13:54)

Как я понимаю, ты никаких специальных действий в сервере для заморозки его в памяти не предпринимаешь, значит и ничего типа Quit не нужно.

Тут проблема в особенностях действий компилятора. Если коротко, сделай так:

 Disp: IDispatch;
begin
 Disp:= CreateOleObject("T2k.Alk");
 Q:= Disp;
 Disp:= nil;
...
 Q:=UnAssigned;
...


 
GanibalLector ©   (2005-12-11 17:03) [2]

2 Набережных С. ©   (11.12.05 15:44) [1]
Спасибо! Как быть в 1С, ведь там нет никаких  IDispatch. Судя по всему нужно создавать метод. Подскажите как правильно "замораживать".


 
Набережных С. ©   (2005-12-11 19:29) [3]


> GanibalLector ©   (11.12.05 17:03) [2]


> Как быть в 1С, ведь там нет никаких  IDispatch.

Ну дык там и дельфийского компилятора нету:)) Не знаю, может там проблемы и не будет. Надо пробовать или спросить у тех, кто работал.

> Подскажите как правильно "замораживать".

Способов несколько, в том числе и неправильные:). Если нужно оставить загруженным конкретный объект, то стандарт - CoLockObjectExternal. Если все объекты могут уничтожаться, а приложение должно продолжать работать, то CoAddRefServerProcess/CoReleaseServerProcess. Они же доступны через защищенный метод ComServer.CountObject. Ну и "неправильный": можно вызвать AddRef у объекта и он не самоуничтожится при отключении последнего клиента, но этот способ нужно использовать аккуратно, а лучше вообще не использовать, первых двух достаточно.


 
GanibalLector ©   (2005-12-11 21:59) [4]

2 Набережных С. ©   (11.12.05 19:29) [3]
Хм...забыл сказать,мой сервер STA(однопоточный апартамент).Т.е я не забочусь на отклик метода,пока не исполнен предыдущий.Более того,клиент и сервер работают тет-а-тет(у меня не может быть 2 и более клиентов на 1 сервер). [3] от этого не меняется ???

З.Ы. Я думал,что будет примерно следующее:

procedure TAlk.Quit;
begin
 Form1.Destroy;
end;


 
Набережных С. ©   (2005-12-12 12:15) [5]


> GanibalLector ©   (11.12.05 21:59) [4]


> Хм...забыл сказать,мой сервер STA(однопоточный апартамент).
> Т.е я не забочусь на отклик метода,пока не исполнен предыдущий.
> Более того,клиент и сервер работают тет-а-тет(у меня не
> может быть 2 и более клиентов на 1 сервер). [3] от этого
> не меняется ???

Нет, от этого ничего не меняется. Тут дело такое, и логика заморозки, и логика разморозки, и логика выгрузки определяются требуемым поведением сервера. То есть сначала нужно определиться, как должен вести себя процесс сервера в различных обстоятельствах - при ручном запуске, при запуске в режиме COM-сервера, при отключении последнего клиента, при попытке закрытия его, когда еще есть подключенные клиенты и т.д. Вот когда определишься со всеми возможными ситуациями, тогда уже можно думать, как реализовать это поведение в коде и что для этого требуется.
Form1.Destroy, конечно, заманчиво:) и даже, вероятно, вполне достаточно в некоторых простых случаях, но реальность, как правило, несколько сложнее. Впрочем, ничего страшного здесь нет, это только сначала кажется сложным, а начнешь делать и увидишь, что все это самое обычное дело, как и при разработке любого другого алгоритма.



Страницы: 1 вся ветка

Текущий архив: 2007.06.24;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.027 c
9-1154734440
Нуб
2006-08-05 03:34
2007.06.24
Как переконвертировать PNG в BMP ?


8-1160305271
AlterEgo of WondeRu
2006-10-08 15:01
2007.06.24
"DirectShow по-русски"


15-1180405300
Slider007
2007-05-29 06:21
2007.06.24
С днем рождения ! 29 мая


15-1180122602
SerJaNT
2007-05-25 23:50
2007.06.24
Разбить bitmap


2-1180234804
vegarulez
2007-05-27 07:00
2007.06.24
Пинг, TIdIcmpClient, except.