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

📄 classobject.cpp

📁 COM+ Programming: A Practical Guide Using Visual C++ and ATL by Pradeep Tapadiya
💻 CPP
字号:
// File ClassObject.cpp

#include "StdAfx.h"
#include "Vcr.h"
#include "ClassObject.h"

CVcrClassObject::CVcrClassObject()
{ 
	m_lRefCount = 0;
}

CVcrClassObject::~CVcrClassObject()
{
}

STDMETHODIMP CVcrClassObject::QueryInterface(REFIID iid, void** ppRetVal)
{
	*ppRetVal = NULL;

	if (IsEqualIID(iid, IID_IUnknown)) {
		*ppRetVal = static_cast<IUnknown*>(this);
	}else
	if (IsEqualIID(iid, IID_IClassFactory)) {
		*ppRetVal = static_cast<IClassFactory*>(this);
	}

	if (NULL != (*ppRetVal)) {
		AddRef();
		return S_OK;
	}

	return E_NOINTERFACE;
}

STDMETHODIMP_(ULONG) CVcrClassObject::AddRef()
{
	long lRetVal = (++m_lRefCount);
	if (lRetVal == 2) {
        // a client is requesting for a AddRef
		g_MyModule.lCount++;
	}
	return lRetVal;
}

STDMETHODIMP_(ULONG) CVcrClassObject::Release()
{
	ULONG lRetVal = (--m_lRefCount);
	if (1 == lRetVal) {
		// all clients have released the references
		g_MyModule.lCount--;
	}else
	if (0 == lRetVal) {
		delete this;
	}
	return lRetVal;
}
    

STDMETHODIMP CVcrClassObject::CreateInstance(
	IUnknown* pUnkOuter,
	REFIID riid,
	void** ppV)
{
	*ppV = NULL; // always initialize the return value

	if (NULL != pUnkOuter) {
		return CLASS_E_NOAGGREGATION;
	}

	CVcr* pVCR = new CVcr;
	if (NULL == pVCR) {
		return E_OUTOFMEMORY;
	}

	HRESULT hr = pVCR->Init();
	if (FAILED(hr)) {
		delete pVCR;
		return hr;
	}

	hr = pVCR->QueryInterface(riid, ppV);
	if (FAILED(hr)) {
		delete pVCR;
	}
	return hr;
}

STDMETHODIMP CVcrClassObject::LockServer(BOOL fLock)
{
	if (TRUE == fLock) {
		g_MyModule.lCount++;
	}else {
		g_MyModule.lCount--;
	}

	return S_OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -