Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Связь с сервером [D7, WinXP]


kblc ©   (2005-08-11 14:51:00) 

Уважаемы мастера, у меня к вам вопрос:

 Если у меня уже запущен один COM-сервер, зарегестрированный в TComObjectFactory с ciSingleInstance и tmSinge, то как к нему присоедениться, не создавая ещё один экземпляр этого сервера (с тем учётом, что самый первый экземпляр уже был создан другим клиентом). CreateComObjectсоздаёт ещё один экземпляр. Как же подключиться к уже активному?


Набережных С.   (2005-11-28 13:58:00) [1]

В кладовке http://kladovka.net.ru/index.cgi?pid=dir&rid=4лежит архив comservice.zip. Есть там и синглетон в исполнении для внепроцессного сервера и однопоточной модели апартамента. Для других случаев внутренности CreateInstance нужно защитить критической секцией. Вот только поможет ли :(


andvalb   (2005-11-28 13:34:00) [2]

Вы используете VCL поэтому с tmFree не стоит а для создания
нескольких instance в одном процессе надо использовать ciMultiInstance но из за VCL подоидет (без переделки) только tmApartment
ThreadComlib (Singleton) использовать так:

 if (CoInitFlags = COINIT_MULTITHREADED) then
 begin
   NeedUnInitializeCOM := Succeeded(CoInitializeEx(nil, CoInitFlags));
   TTaskManager.Create(ComServer, TAutoObject, Class_TaskManager, ciMultiInstance, tmFree);
 end
 else
 begin
   NeedUnInitializeCOM := Succeeded(CoInitializeEx(nil, COINIT_APARTMENTTHREADED));
   TTaskManager.Create(ComServer, TAutoObject, Class_TaskManager,
     ciMultiInstance, tmApartment);
 end;
(пример)
где TTaskManager потомок Singleton
можно и просто
InitializeSingletonAutoObject(.....) - (в ComLib)

CoInitializeEx надо только если при инициализации используется подсистема COM
так как этот Singleton создается непосредственно при инициализации приложения (до инициализации подсистемы COM в этой нитке).


GanibalLector   (2005-08-13 21:48:00) [3]

Сабж сделан на D5.


GanibalLector   (2005-08-13 21:46:00) [4]

> клиент всё-равно создаст второй COM-сервер и подулючиться к нему?

Не создаст,но подключиться. Пример выслал.
З.Ы. И все-таки,обратись к литературе!!! Тем более,что она на русском ;)


kblc   (2005-08-13 07:48:00) [5]

С сервера http://www.techvanguards.comя взял ComLib.zip, там содержется TSingletonComObject и ещё много чего, но я не могу понять как этим пользоваться! :(( может кто работал? подскажите плз...


kblc   (2005-08-13 07:46:00) [6]

Но ведь в этом примере второй клиент всё-равно создаст второй COM-сервер и подулючиться к нему? да?


kblc   (2005-08-13 07:31:00) [7]

e-mail у меня есть ;) kbica@mail.ru
Не мог бы ты прислать мне этот пример, а то я что-то не понимаю...


GanibalLector   (2005-08-13 01:04:00) [8]

2 kblc ©

> Только вот использовать "Instancing+Free" не получаеться
Все получается.Может,Вы не умеете их готовить??? ;)

>Вот теперь, после прочтения статьи, всё понял..
То не статья ;) А книга на 700 стр. В частности глава 3.

Ввиду того,что e-maila я у Вас не нашел приведу мой РАБОЧИЙ код(для примера,на коленях деланный).

Итак,сервер :

...
private
   CS:TRTLCriticalSection;
 public
   procedure LockForm;
   procedure UnLockForm;
 end;
...
procedure TForm1.LockForm;
begin
  EnterCriticalSection(CS);
end;

procedure TForm1.UnLockForm;
begin
 LeaveCriticalSection(CS);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 InitializeCriticalSection(CS);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
 DeleteCriticalSection(CS);
end;

Unit2
...
function TTalla2k.Get_Text: WideString;
begin
 try
   Form1.LockForm;
   Result:=Form1.Memo1.Text;
 finally
   Form1.UnLockForm;
 end;
end;

procedure TTalla2k.Set_Text(const Value: WideString);
begin
 try
   Form1.LockForm;
   Form1.Memo1.Lines.Add(Value);
 finally
   Form1.UnLockForm;
 end;
end;

...



Клиент :

private
   Q:Variant;
...
procedure TForm1.Button1Click(Sender: TObject);
begin
 Q.Text:=Edit1.Text;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 if VarType(Q)= varDispatch then
 begin
   Button2.Caption:='Connect';
   Q:=UnAssigned;
 end else
 begin
   Button2.Caption:='Disconnect';
   Q:=CreateOleObject('Test.Talla2k');
 end;
end;


И все работает ;)


Opuhshii   (2005-08-12 11:32:00) [9]

в первом ответе


kblc   (2005-08-12 11:08:00) [10]

т.е. нужно использовать CoMarshalInterface/CoUnmarshalInterface ? и ещё реализовать в своём объекте IMarshal ?


Opuhshii   (2005-08-12 11:03:00) [11]

имхо ответ тебе дали в первом ответе на "Связь с объектом"


kblc   (2005-08-12 10:48:00) [12]

проше прощения, но ошибка оталась. Я прото перепутпал. Он всё равно создаёт новый Com сервер! Почему???


kblc   (2005-08-12 10:03:00) [13]

Вот теперь, после прочтения статьи, всё понял... ;) Большое спасибо. Только вот использовать " Instancing+Free" не получаеться - я использую " Instancing+Apartment"


kblc   (2005-08-12 08:23:00) [14]

Я сделал как вы сказали, Сергей. ( rebuid && reregister) Теперь у меня появляеться ошибка "Interface not supported". Достаточно странно... Не могла бы вы объяснить мне в чёт тут дело?


GanibalLector   (2005-08-12 02:15:00) [15]

Multiple Instancing+Free даст желаемый результат.А вообще,следует обратиться к "Delphi и COM" глава3 и 6. Там все прекрасно описано.


Opuhshii   (2005-08-11 23:35:00) [16]

Наверное это не то что тебе нужно,
CoMarshalInterface/CoUnmarshalInterface


kblc   (2005-08-11 20:56:00) [17]

Помогитеее! Плииииззззз....


Наверх

Титульная страница Поиск, карта сайта Написать письмо