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

Вниз

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

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

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

Наверх




Память: 0.49 MB
Время: 0.046 c
15-1176376503
Kerk
2007-04-12 15:15
2007.05.13
Mail::POP3Client


2-1176910631
p3.14
2007-04-18 19:37
2007.05.13
High, Low и двумерный массив


15-1176723476
Yaros-hoi
2007-04-16 15:37
2007.05.13
Фильтрация по дате


2-1177416513
Ксандр
2007-04-24 16:08
2007.05.13
SendMessage...


3-1171890225
Itonix
2007-02-19 16:03
2007.05.13
Дерево БД





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский