Форум: "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