__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
FTestEvents = CoTestEvents_::Create();
...
Проблема с запуском COM сервера
В конструкторе клиента я делаю просто CoLogServer::Create(), поэтому я так понимаю сервер и запускается каждый раз. Как быть?
В сервере надо вызвать CoRegisterClassObject(...) с флагом REGCLS_MULTIPLEUSE; В Atl обёрткой для CoRegisterClassObject(...) является RegisterClassObjects(...).
Цитата: POlegin
...
В конструкторе клиента я делаю просто CoLogServer::Create(), поэтому я так понимаю сервер и запускается каждый раз. Как быть?
это как ты так умудряешься, у меня так не получается?
1. File|New|Application
2. File|New|ActiveX|Com Object
3. В конструкторе формы:
Код:
запускаю 1 клиент - 1 сервер, 2 клиента - 1 сервер и т.д.
ЗЫ: правда у меня ВСВ5, но в ВСВ6 все равно ATL3.0 и врядли, что там поправили
Это я в клиенте так делаю.
Цитата: POlegin
Это я в клиенте так делаю.
Вот и я "в клиенте" и у меня один сервер на всех.
// *********************************************************************//
// 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;
TCOMIMyComponent FMyComponent.
Тогда уже в конструкторе можно делать так:
FMyComponent = CoMyComponent::Create();
Цитата: POlegin
Com Object добавляеш тока когда компонент свой пишеш, а для клиента см. выше.
А я что сделал? Создал локальный (в ехе) СОМ-сервер на ВСВ, читай внимательно мой первый пост, где и добавил СОМ-объжект.
Затем создал клиента (файлы типа tlb_h и tlb_cpp имеются ведь сервер создавал я сам)
а дальще тестирую:
Код:
FTestEvents = CoTestEvents_::Create();
получается:
один клиент - один сервер
два клиента - один сервер
и т.д.
ну если токлько сервер не ты писал, тогда ничего не поделаешь похоже...