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