COM IClassFactory接口封装

CAbstractClassFactory.h
#include <objbase.h>
#include <unknwn.h>
#define DECLARE_IUNKNOWN_INTERFACE														\
	public:																				\
	virtual HRESULT _stdcall QueryInterface(const IID& riid,void** ppvObject);			\
	virtual ULONG _stdcall AddRef ();													\
	virtual ULONG _stdcall Release();
class CAbstractClassFactory:public IClassFactory
{
public:
	CAbstractClassFactory();
	DECLARE_IUNKNOWN_INTERFACE
	virtual HRESULT _stdcall CreateInstance(IUnknown *pUnkOuter,const IID& riid,void** ppvObject)=0;
    virtual HRESULT _stdcall LockServer(BOOL fLock);
	long m_caref,g_caref;
};
const CLSID CLSID_CAbstractClassFactory = {0x59F6C62A,0x50BE,0x4687,{0x95,0x80,0x59,0xC4,0x8F,0x94,0xE5,0xD8}};

 

CAbstractClassFactory.cpp
#include "CAbstractClassFactory.h"
CAbstractClassFactory::CAbstractClassFactory(){m_caref=1;g_caref=1;}
HRESULT _stdcall CAbstractClassFactory::QueryInterface(const IID& riid,void** ppvObject)
{
	if(riid==IID_IUnknown||riid==IID_IClassFactory)
	{
		*ppvObject=static_cast<IClassFactory*>(this);
	}
	else
	{
		*ppvObject=NULL;
		return E_NOINTERFACE;
	}
	return S_OK;
	
}
ULONG _stdcall CAbstractClassFactory::AddRef()
{
	return InterlockedIncrement(&m_caref);
}
ULONG _stdcall CAbstractClassFactory::Release()
{
	if(InterlockedDecrement(&m_caref)==0)
	{
		delete this;
		return 0;
	}
	return m_caref;
}
HRESULT _stdcall CAbstractClassFactory::LockServer(BOOL fLock)
{
	if(fLock)
	{
		InterlockedIncrement(&g_caref);
	}
	else
	{
		InterlockedDecrement(&g_caref);
	}
	return S_OK;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值