![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Связь с сервером [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]Помогитеее! Плииииззззз....