От: | frogkiller | ||
Дата: | 04.09.06 10:56 | ||
Оценка: |
template <class T>
class CMeyersSingleton
{
protected:
CMeyersSingleton() {}
~CMeyersSingleton() {}
public:
static T &GetInstance()
{
static T obj;
return obj;
}
};
class CTestClass1 : public CMeyersSingleton<CTestClass1>
{
friend class CMeyersSingleton<CTestClass1>;
private:
CTestClass1()
{
printf("CTestClass1()\r\n");
}
public:
int Perform() { return 0; }
~CTestClass1()
{
printf("~CTestClass1()\r\n");
}
};
class ATL_NO_VTABLE CTest :
public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CTest, &CLSID_Test>,
public IDispatchImpl<ITest, &IID_ITest, &LIBID_COMWithStaticSingletonLib, /*wMajor =*/ 1, /*wMinor =*/ 0>
{
public:
CTest()
{
printf("CTest()\r\n");
}
virtual ~CTest()
{
printf("~CTest()\r\n");
}
STDMETHOD(Perform)(void);
...
}
STDMETHODIMP CTest::Perform(void)
{
int qwe = CTestClass1::GetInstance().Perform();
return S_OK;
}
#import "..\COMWithStaticSingleton\Debug\comwithstaticsingleton.dll"
void Test()
{
COMWithStaticSingletonLib::ITestPtr ptr;
ptr.CreateInstance(__uuidof(COMWithStaticSingletonLib::Test));
ptr->Perform();
//ptr.Release();
}
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);
printf("CoInitialize(NULL)\r\n");
Test();
printf("Test() finished\r\n");
CoUninitialize();
printf("CoUninitialize()\r\n");
return 0;
}
CoInitialize(NULL)
CTest()
CTestClass1()
~CTest()
Test() finished
~CTestClass1()
CoUninitialize()