Прошу прощения, если баян — в поиске ничего не нашел.
Есть exe-сервер, созданный в VS6.0. Тип проекта — MFC, куда добавлена поддержка ATL. Все делалось с помощью мастеров, руками была добавлена только декларация
DECLARE_CLASSFACTORY_SINGLETON. При этом работало все так: при запуске приложения автоматически создавался экземпляр объекта, в FinalConstruct которого выполнялась инициализация всяких внутренних структур данных. Приложение было работоспособно и без клиентов (в этом режиме выполняется его настройка, конфигурирование и т.п.).
Решил проапгрейдится до VS2003 и столкнулся с проблемой: при запуске программы экземпляр объекта не создается, FinalConstruct не вызывается, структуры данных пустые. Объект возникает он только при первом вызове CreateInstance на клиенте. Попробовал VS2005 — то же самое. Сделал новый проект в VS2005 — то же самое.
Как сделать так, чтобы singleton-объект создавался при запуске приложения?
Re: DECLARE_CLASSFACTORY_SINGLETON в VS6, 7.0, 7.1
M>Как сделать так, чтобы singleton-объект создавался при запуске приложения?
Singleton лучше всего запихать в сервис. Создай ATL сервис на атрибутах, возьми функцию Run() ипереопредели ее примерно так
Здравствуйте, Виктор Юров, Вы писали:
M>>Как сделать так, чтобы singleton-объект создавался при запуске приложения? ВЮ>Singleton лучше всего запихать в сервис. Создай ATL сервис на атрибутах, возьми функцию Run() ипереопредели ее примерно так
[]
человеку COM .exe сервер нужен, а не сервис.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[3]: DECLARE_CLASSFACTORY_SINGLETON в VS6, 7.0, 7.1
КЛ>>человеку COM .exe сервер нужен, а не сервис. ВЮ>ATL сервис с ключиком /RegServer = COM .exe сервер
хорошо, никогда сервисы не делал, но там вроде всякая лишняя лабуда добавляется.
Похоже, подход к созданию синглтонов в ATL 7.1 стал отличаться от поведения в 6 студии. Я например, в WinMain сам создаю свой синглтон.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: DECLARE_CLASSFACTORY_SINGLETON в VS6, 7.1, 8.0
Вот чувствую я, что должен быть другой способ. Что удалось нарыть:
В 6.0 мой объект создается при следущем вызове (из InitInstance):
_Module.RegisterClassObjects(CLSCTX_SERVER, REGCLS_MULTIPLEUSE);
Прошелся в нем отладчиком, обнаружил вот что:
1) вызывается new для фабрики класса
2) вызывается конструктор класса CComClassFactorySingleton
3) конструктор CComClassFactory
4) конструктор CComObjectRootEx<ATL::CComMultiThreadModel>
5) конструктор CComObjectRootBase
6) в конструкторе CComObjectGlobal создается мой объект
Все замечательно.
В 8.0 (с версиями в сабже ошибся) зашел в ту же функцию:
1) вызывается new для фабрики класса
2) вызывается конструктор класса CComClassFactorySingleton
3) конструктор CComClassFactory
4) конструктор CComObjectRootEx<ATL::CComMultiThreadModel>
5) конструктор CComObjectRootBase
До CComObjectGlobal дело так и не доходит, мой объект
не создается.
Выходит надо как-то заставить вызываться конструктор CComObjectGlobal.
Буду копать дальше
Re[3]: DECLARE_CLASSFACTORY_SINGLETON в VS6, 7.1, 8.0
ATL3 — Singleton created when class factory created
ATL71 — Singleton created first time IClassFactory::CreateInstance is
called for that class.
ATL3 — Uses CComObjectGlobal to implement singleton
ATL71 — Uses CComObjectCached to implement singleton
ATL3 — Singleton's AddRef/Release directly changes module's lock count.
ATL71 — Singleton has own refcount. Module lock count updated on 1<->2
ref transition (see CComObjectCached).
ATL3 — Singleton is destroyed when class factory is destroyed
ATL71 — Singleton is destroyed when class factory is destroyed (or if
you call Release one too many times.)
In ATL71, m_spObj is a data member of the ClassFactory. It will be
released when the class factory is destroyed, which will be when the DLL
is unloaded.