Главная страница
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.49 MB
Время: 0.017 c
2-1180574560
Ш-К
2007-05-31 05:22
2007.06.24
Отобразить 4 байта


15-1179978466
AleKo
2007-05-24 07:47
2007.06.24
Лицензия на BDS2006


15-1180034182
flaxe
2007-05-24 23:16
2007.06.24
Срочно Лаба, завтра сдавать, маленьткий вопросик)


4-1168369137
bsasha
2007-01-09 21:58
2007.06.24
Выборка более 1000 записей из AD


2-1180941562
mrFreeman
2007-06-04 11:19
2007.06.24
Преобразование TStrings в String и чтение строк из TListBox