📄 factory2.cpp
字号:
// Get needed compiler include files
#include <iostream>
// Get needed system and custom include files
#define INITGUID
#include "Utility.h"
#include "Factory2.h"
#include "Fortune2.h"
#include "Counts.h"
// Constructor
ComFortuneTellerFactory::ComFortuneTellerFactory()
: m_cRef(0)
{
// Be annoying and verbose
VerboseMsg("Constructing new ComFortuneTellerFactory object.\n");
}
//
// IUnknown methods
//
STDMETHODIMP ComFortuneTellerFactory::QueryInterface(REFIID rIID,
PPVOID ppvInterface)
{
VerboseMsg("In ComFortuneTellerFactory::QueryInterface\n");
// Initialize returned interface pointer
*ppvInterface = NULL;
// Set the interface pointer
if (rIID == IID_IUnknown) {
VerboseMsg(" Requesting IUnknown interface.\n");
*ppvInterface = this;
}
else if (rIID == IID_IClassFactory) {
VerboseMsg(" Requesting IClassFactory interface.\n");
*ppvInterface = this;
}
// We don't support this interface
else {
VerboseMsg(" Requesting unsupported interface.\n");
*ppvInterface = NULL;
return E_NOINTERFACE;
}
// Bump up the reference count
((LPUNKNOWN) *ppvInterface)->AddRef();
return NOERROR;
}
STDMETHODIMP_(ULONG) ComFortuneTellerFactory::AddRef()
{
// Increment the reference count
m_cRef++;
// Convert to string and display
VerboseMsg("In ComFortuneTellerFactory::AddRef. Reference count = "
+ ULongToStr(m_cRef) + "\n");
return m_cRef;
}
STDMETHODIMP_(ULONG) ComFortuneTellerFactory::Release()
{
// Decrement the reference count
m_cRef--;
// Convert to string and display
VerboseMsg("In ComFortuneTellerFactory::Release. Reference count = "
+ ULongToStr(m_cRef) + "\n");
// Is this the last reference to the object?
if (m_cRef)
return m_cRef;
// Self destruct
VerboseMsg(" ComFortuneTellerFactory reference count is 0. Deleting self.\n");
delete this;
return 0;
}
//
// IFortuneTeller methods
//
STDMETHODIMP ComFortuneTellerFactory::CreateInstance(LPUNKNOWN pUnkOuter,
REFIID rIID,
PPVOID ppvInterface)
{
PComFortuneTeller pObj;
HRESULT hResult;
VerboseMsg("In ComFortuneTellerFactory::CreateInstance\n");
// Initialize returned interface pointer
*ppvInterface = NULL;
// Check for a controlling unknown
if (pUnkOuter && rIID != IID_IUnknown)
return CLASS_E_NOAGGREGATION;
//Create the object passing function to notify on destruction.
VerboseMsg(" Creating new ComFortuneTeller object\n");
pObj = new ComFortuneTeller;
// Out of memory?
if (!pObj) {
VerboseMsg(" FortuneTeller object creation failed.\n");
return E_OUTOFMEMORY;
}
// Now obtain the requested interface
hResult = pObj->QueryInterface(rIID, ppvInterface);
// Destroy the object if the desired interface couldn't be obtained
if (FAILED(hResult)) {
delete pObj;
return hResult;
}
// Everything looks good. Bump up the server object count
Counters::IncObjectCount();
return NOERROR;
}
STDMETHODIMP ComFortuneTellerFactory::LockServer(BOOL fLock)
{
VerboseMsg("In ComFortuneTellerFactory::LockServer\n");
// Are we locking or unlocking?
if (fLock) {
// Locking
VerboseMsg(" Incrementing server lock count\n");
Counters::IncLockCount();
}
else {
// Unlocking
VerboseMsg(" Decrementing server lock count\n");
Counters::DecLockCount();
}
return NOERROR;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -