Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Corba";
Текущий архив: 2007.06.24;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "Corba";
Текущий архив: 2007.06.24;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.042 c
8-1160561120
zorgens
2006-10-11 14:05
2007.06.24
DSPack


15-1179931482
partizan
2007-05-23 18:44
2007.06.24
Задача по выч. геометрии


15-1180213750
Kostafey
2007-05-27 01:09
2007.06.24
С днем рождения ! 27 мая


2-1180593796
Soi_
2007-05-31 10:43
2007.06.24
Сортировка данных


2-1180547867
aidyn
2007-05-30 21:57
2007.06.24
Как загрузить текстовый файл в Delphi?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский