Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Проблема с запуском COM сервера

42K
16 декабря 2008 года
POlegin
6 / / 16.12.2008
Есть COM сервер в exe созданный в Builder C++, также есть клиент написанный там же. Так вот, я не могу сделать так, чтобы всякий раз при запуске клиента не создавалась новая копия сервера, а клиент подключался к уже работающей проге(серверу). Интерфейс в сервере наследует IUnknown. ATL автоматом создаёт такой код в файле ***_TLB.h : typedef TCoClassCreatorT<TCOMILogServer, ILogServer, &CLSID_LogServer, &IID_ILogServer> CoLogServer.
В конструкторе клиента я делаю просто CoLogServer::Create(), поэтому я так понимаю сервер и запускается каждый раз. Как быть?
2.2K
16 декабря 2008 года
REFOT
181 / / 08.04.2005
В сервере надо вызвать CoRegisterClassObject(...) с флагом REGCLS_MULTIPLEUSE; В Atl обёрткой для CoRegisterClassObject(...) является RegisterClassObjects(...).
246
19 декабря 2008 года
GIZMO
1.8K / / 30.07.2004
Цитата: POlegin

...
В конструкторе клиента я делаю просто CoLogServer::Create(), поэтому я так понимаю сервер и запускается каждый раз. Как быть?



это как ты так умудряешься, у меня так не получается?
1. File|New|Application
2. File|New|ActiveX|Com Object
3. В конструкторе формы:

 
Код:
__fastcall TForm1::TForm1(TComponent* Owner)
    : TForm(Owner)
{
     FTestEvents = CoTestEvents_::Create();
     ...

запускаю 1 клиент - 1 сервер, 2 клиента - 1 сервер и т.д.

ЗЫ: правда у меня ВСВ5, но в ВСВ6 все равно ATL3.0 и врядли, что там поправили
42K
19 декабря 2008 года
POlegin
6 / / 16.12.2008
Это я в клиенте так делаю.
246
19 декабря 2008 года
GIZMO
1.8K / / 30.07.2004
Цитата: POlegin
Это я в клиенте так делаю.


Вот и я "в клиенте" и у меня один сервер на всех.

42K
19 декабря 2008 года
POlegin
6 / / 16.12.2008
Что тоя не понял, ты в клиенте Com Object добовляешь чтоли? Если да, то у тебя так в жизни не получится. В клиенте надо сделать Project->Import Type Library. В окне выбора библиотек типа выбираеш свой зарегестрированный компонент, убираешь галочку Generate Wrappers (или чё то в этом роде) и жмешь Create Unit, он тебе 4 (может больше может меньше) файла в проект должен добавить (ну два точно) - ***_TLB.H, ***_TLB.CPP. Com Object добавляеш тока когда компонент свой пишеш, а для клиента см. выше. Открываешь ***_TLB.H находиш в конце файла такой код

// *********************************************************************//
// The following typedefs expose classes (named CoCoClassName) that
// provide static Create() and CreateRemote(LPWSTR machineName) methods
// for creating an instance of an exposed object. These functions can
// be used by client wishing to automate CoClasses exposed by this
// typelibrary.
// *********************************************************************//

// *********************************************************************//
// COCLASS DEFAULT INTERFACE CREATOR
// CoClass : Название твоего компонента
// Interface: Класс интерфейса
// *********************************************************************//
#endif // __TLB_NO_INTERFACE_WRAPPERS

и перед #endif если билдер сам ничё не вставил пишешь

typedef TCoClassCreatorT<TCOMILogServer, ILogServer, &CLSID_LogServer, &IID_ILogServer> CoLogServer;

LogServer это название моего компонента вместо него пишешь свой компонент например

typedef TCoClassCreatorT<TCOMIMyComponent, IMyComponent, &CLSID_MyComponent, &IID_IMyComponent> CoMyComponent;
42K
19 декабря 2008 года
POlegin
6 / / 16.12.2008
Чуть не забыл, надо еще переменную типа TCOMIMyComponent объявить. т.е.

TCOMIMyComponent FMyComponent.

Тогда уже в конструкторе можно делать так:

FMyComponent = CoMyComponent::Create();
246
20 декабря 2008 года
GIZMO
1.8K / / 30.07.2004
Цитата: POlegin
Com Object добавляеш тока когда компонент свой пишеш, а для клиента см. выше.


А я что сделал? Создал локальный (в ехе) СОМ-сервер на ВСВ, читай внимательно мой первый пост, где и добавил СОМ-объжект.
Затем создал клиента (файлы типа tlb_h и tlb_cpp имеются ведь сервер создавал я сам)
а дальще тестирую:

 
Код:
FTestEvents = CoTestEvents_::Create();

получается:
один клиент - один сервер
два клиента - один сервер
и т.д.
246
23 декабря 2008 года
GIZMO
1.8K / / 30.07.2004
ну если токлько сервер не ты писал, тогда ничего не поделаешь похоже...
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог