📄 sharedobject.cpp
字号:
//
// Shared Server Class Factory
//
// Code based on COleObjectFactory (c) 1997 Microsoft Corporation
//
#include "stdafx.h"
#include "sharedobject.h"
IMPLEMENT_DYNAMIC(COleObjectFactoryShared, COleObjectFactory)
COleObjectFactoryShared::COleObjectFactoryShared(REFCLSID clsid,
CRuntimeClass* pRuntimeClass, BOOL bMultiInstance, LPCTSTR lpszProgID)
:COleObjectFactory(clsid, pRuntimeClass, bMultiInstance, lpszProgID)
{
// clear the registered server ID member
m_dwRegister = NULL;
}
BEGIN_INTERFACE_MAP(COleObjectFactoryShared, COleObjectFactory)
INTERFACE_PART(COleObjectFactoryShared, IID_IClassFactory, SubClassFactory)
INTERFACE_PART(COleObjectFactoryShared, IID_IClassFactory2, SubClassFactory)
END_INTERFACE_MAP()
/////////////////////////////////////////////////////////////////////////////
// Implementation of COleObjectFactoryShared::IClassFactory interface
STDMETHODIMP_(ULONG) COleObjectFactoryShared::XSubClassFactory::AddRef()
{
METHOD_PROLOGUE_EX_(COleObjectFactoryShared, SubClassFactory)
return pThis->m_xClassFactory.AddRef();
}
STDMETHODIMP_(ULONG) COleObjectFactoryShared::XSubClassFactory::Release()
{
METHOD_PROLOGUE_EX_(COleObjectFactoryShared, SubClassFactory)
return pThis->m_xClassFactory.Release();
}
STDMETHODIMP COleObjectFactoryShared::XSubClassFactory::QueryInterface(
REFIID iid, LPVOID* ppvObj)
{
METHOD_PROLOGUE_EX_(COleObjectFactoryShared, SubClassFactory)
return pThis->m_xClassFactory.QueryInterface(iid, ppvObj);
}
STDMETHODIMP COleObjectFactoryShared::XSubClassFactory::CreateInstance(
IUnknown* pUnkOuter, REFIID riid, LPVOID* ppvObject)
{
METHOD_PROLOGUE_EX_(COleObjectFactoryShared, SubClassFactory)
HRESULT hResult = S_OK;
// Initialize an IUnknown reference
LPUNKNOWN pIUnknown = NULL;
// see if the object is already running
::GetActiveObject(riid, NULL, &pIUnknown);
// if we didn't get a reference to a running object
if(!pIUnknown)
{
// create the server
hResult = pThis->m_xClassFactory.CreateInstanceLic(pUnkOuter, NULL, riid, NULL, ppvObject);
// if successful
if(hResult == S_OK)
{
// register the clsid as an active object so other applications will get the same object
if(::RegisterActiveObject((IUnknown*)*ppvObject, riid, ACTIVEOBJECT_STRONG, &pThis->m_dwRegister) != S_OK)
// clear the ID member
pThis->m_dwRegister = NULL;
}
else
// clear the ID member
pThis->m_dwRegister = NULL;
}
else
// use the running object
*ppvObject = pIUnknown;
return hResult;
}
STDMETHODIMP COleObjectFactoryShared::XSubClassFactory::LockServer(BOOL fLock)
{
METHOD_PROLOGUE_EX(COleObjectFactoryShared, SubClassFactory)
return pThis->m_xClassFactory.LockServer(fLock);
}
STDMETHODIMP COleObjectFactoryShared::XSubClassFactory::GetLicInfo(
LPLICINFO pLicInfo)
{
METHOD_PROLOGUE_EX(COleObjectFactoryShared, SubClassFactory)
return pThis->m_xClassFactory.GetLicInfo(pLicInfo);
}
STDMETHODIMP COleObjectFactoryShared::XSubClassFactory::RequestLicKey(
DWORD dwReserved, BSTR* pbstrKey)
{
METHOD_PROLOGUE_EX(COleObjectFactoryShared, SubClassFactory)
return pThis->m_xClassFactory.RequestLicKey(dwReserved, pbstrKey);
}
STDMETHODIMP COleObjectFactoryShared::XSubClassFactory::CreateInstanceLic(
LPUNKNOWN pUnkOuter, LPUNKNOWN pUnkReserved, REFIID riid,
BSTR bstrKey, LPVOID* ppvObject)
{
METHOD_PROLOGUE_EX(COleObjectFactoryShared, SubClassFactory)
HRESULT hResult = S_OK;
// clear the ID member
pThis->m_dwRegister = NULL;
// Initialize an IUnknown reference
LPUNKNOWN pIUnknown = NULL;
// see if the object is already running
::GetActiveObject(riid, NULL, &pIUnknown);
// if we didn't get a reference to a running object
if(!pIUnknown)
{
// create the server
hResult = pThis->m_xClassFactory.CreateInstanceLic(pUnkOuter, pUnkReserved, riid, bstrKey, ppvObject);
// if successful
if(hResult == S_OK)
{
// register the clsid as an active object so other applications will get the same object
if(::RegisterActiveObject((IUnknown*)*ppvObject, riid, ACTIVEOBJECT_STRONG, &pThis->m_dwRegister) != S_OK)
// clear the ID member
pThis->m_dwRegister = NULL;
}
}
else
// use the running object
*ppvObject = pIUnknown;
return hResult;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -