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

Вниз

Связь с сервером   Найти похожие ветки 

 
kblc ©   (2005-08-11 14:51) [0]

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

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


 
kblc ©   (2005-08-11 20:56) [1]

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


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

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


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

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


 
kblc ©   (2005-08-12 08:23) [4]

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


 
kblc ©   (2005-08-12 10:03) [5]

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


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

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


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

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


 
kblc ©   (2005-08-12 11:08) [8]

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


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

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


 
GanibalLector ©   (2005-08-13 01:04) [10]

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;


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


 
kblc ©   (2005-08-13 07:31) [11]

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


 
kblc ©   (2005-08-13 07:46) [12]

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


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

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


 
GanibalLector ©   (2005-08-13 21:46) [14]

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

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


 
GanibalLector ©   (2005-08-13 21:48) [15]

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


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

Вы используете 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 в этой нитке).


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

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



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

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

Наверх




Память: 0.51 MB
Время: 0.059 c
2-1177391484
allucard
2007-04-24 09:11
2007.05.13
Указатели


1-1174234562
Midnighter
2007-03-18 19:16
2007.05.13
Динамическая линковка интерфейсов


6-1162980648
Out
2006-11-08 13:10
2007.05.13
Разрыв соединения


15-1176302795
Mr. D.
2007-04-11 18:46
2007.05.13
Изменение стиля поведения TDBGrid


11-1159024651
ZiTrAX
2006-09-23 19:17
2007.05.13
KOL(KOLIBEvents)+FreePascal