⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sharedobject.cpp

📁 主要介绍vc++6.0的编程过程
💻 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 + -