Здравствуйте, Vi2,
Я разобрался в чём дело. В отличие от ATL 3.0, ATL 7.1 не создаёт "реальных объектов ... Кроме синглетонов". Тут Vita прав. Однако, я ожидал поведения, как в ATL 3.0.
При внимательном просмотре кода внутренностей ATL я обнаружил, что одно из отличий в реализации singleton'а заключается как раз в создании глобального объекта в ATL 3.0.
Вот, что есть в ATL 7.1:
/////////////////////////////////////////////////////////////////////////////////////////////
// Singleton Class Factory
template <class T>
class CComClassFactorySingleton : public CComClassFactory
{
public:
CComClassFactorySingleton() : m_hrCreate(S_OK)
{
}
virtual ~CComClassFactorySingleton()
{
}
// IClassFactory
STDMETHOD(CreateInstance)(LPUNKNOWN pUnkOuter, REFIID riid, void** ppvObj)
...
HRESULT m_hrCreate;
CComPtr<IUnknown> m_spObj;
};
А вот, что было в ATL 3.0:
/////////////////////////////////////////////////////////////////////////////////////////////
// Singleton Class Factory
template <class T>
class CComClassFactorySingleton : public CComClassFactory
{
public:
void FinalRelease()
{
CoDisconnectObject(m_Obj.GetUnknown(), 0);
}
// IClassFactory
STDMETHOD(CreateInstance)(LPUNKNOWN pUnkOuter, REFIID riid, void** ppvObj)
...
CComObjectGlobal<T> m_Obj;
};
Т.е. в ATL 7.1. глобальный объект надо создавать ручками дополнительно.