2022-09-09 20:44:40 +08:00
|
|
|
#include "pch.h"
|
|
|
|
|
|
|
|
#include "ClassFactory.h"
|
|
|
|
#include "ExplorerCommand.h"
|
2022-09-12 19:55:47 +08:00
|
|
|
#include "dllmain.h"
|
|
|
|
|
|
|
|
// Class ctor/dtors
|
|
|
|
|
|
|
|
ClassFactory::ClassFactory(_In_ REFCLSID clsid) :
|
|
|
|
m_ref_count(1),
|
|
|
|
m_clsid(clsid)
|
|
|
|
{
|
|
|
|
++globals::ref_count;
|
|
|
|
}
|
|
|
|
|
|
|
|
ClassFactory::~ClassFactory()
|
|
|
|
{
|
|
|
|
--globals::ref_count;
|
|
|
|
}
|
2022-09-09 20:44:40 +08:00
|
|
|
|
|
|
|
// Implementations of inherited IUnknown methods
|
|
|
|
|
|
|
|
IFACEMETHODIMP ClassFactory::QueryInterface(REFIID riid, void** ppv)
|
|
|
|
{
|
|
|
|
static const QITAB qit[] = {
|
|
|
|
QITABENT(ClassFactory, IClassFactory),
|
|
|
|
{ 0, 0 },
|
|
|
|
};
|
|
|
|
return QISearch(this, qit, riid, ppv);
|
|
|
|
}
|
|
|
|
|
|
|
|
IFACEMETHODIMP_(ULONG) ClassFactory::AddRef()
|
|
|
|
{
|
|
|
|
return ++m_ref_count;
|
|
|
|
}
|
|
|
|
|
|
|
|
IFACEMETHODIMP_(ULONG) ClassFactory::Release()
|
|
|
|
{
|
|
|
|
auto result = --m_ref_count;
|
|
|
|
if (result == 0)
|
|
|
|
{
|
|
|
|
delete this;
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Implementations of inherited IClassFactory methods
|
|
|
|
|
|
|
|
IFACEMETHODIMP ClassFactory::CreateInstance(IUnknown* pUnkOuter, REFIID riid, void** ppvObject)
|
|
|
|
{
|
|
|
|
*ppvObject = NULL;
|
|
|
|
HRESULT hr;
|
|
|
|
if (pUnkOuter)
|
|
|
|
{
|
|
|
|
hr = CLASS_E_NOAGGREGATION;
|
|
|
|
}
|
|
|
|
else if (m_clsid == __uuidof(ExplorerCommand))
|
|
|
|
{
|
|
|
|
hr = ExplorerCommand::s_CreateInstance(pUnkOuter, riid, ppvObject);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
hr = CLASS_E_CLASSNOTAVAILABLE;
|
|
|
|
}
|
|
|
|
return hr;
|
|
|
|
}
|
2022-09-12 19:55:47 +08:00
|
|
|
|
|
|
|
IFACEMETHODIMP ClassFactory::LockServer(BOOL fLock)
|
|
|
|
{
|
|
|
|
if (fLock)
|
|
|
|
{
|
|
|
|
++globals::ref_count;
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
--globals::ref_count;
|
|
|
|
}
|
|
|
|
|
|
|
|
return S_OK;
|
|
|
|
}
|