81 lines
No EOL
1.5 KiB
C++
81 lines
No EOL
1.5 KiB
C++
#include "ClassFactory.h"
|
|
#include "FrameworkContextMenuExt.h"
|
|
#include <Shlwapi.h>
|
|
#include <new>
|
|
#pragma comment(lib, "shlwapi.lib")
|
|
|
|
extern long g_cDllRef;
|
|
|
|
ClassFactory::ClassFactory(): m_cRef(1)
|
|
{
|
|
InterlockedIncrement(&g_cDllRef);
|
|
}
|
|
|
|
ClassFactory::~ClassFactory()
|
|
{
|
|
InterlockedDecrement(&g_cDllRef);
|
|
}
|
|
|
|
#pragma region IUnknown
|
|
|
|
IFACEMETHODIMP ClassFactory::QueryInterface(REFIID riid, void **ppv)
|
|
{
|
|
static const QITAB qit[] =
|
|
{
|
|
QITABENT(ClassFactory, IClassFactory),
|
|
{ 0 },
|
|
};
|
|
return QISearch(this, qit, riid, ppv);
|
|
}
|
|
|
|
IFACEMETHODIMP_(ULONG) ClassFactory::AddRef()
|
|
{
|
|
return InterlockedIncrement(&m_cRef);
|
|
}
|
|
|
|
IFACEMETHODIMP_(ULONG) ClassFactory::Release()
|
|
{
|
|
ULONG cRef = InterlockedDecrement(&m_cRef);
|
|
if (!cRef)
|
|
delete this;
|
|
|
|
return cRef;
|
|
}
|
|
|
|
#pragma endregion
|
|
|
|
#pragma region IClassFactory
|
|
|
|
IFACEMETHODIMP ClassFactory::CreateInstance(IUnknown *pUnkOuter, REFIID riid, void **ppv)
|
|
{
|
|
HRESULT hr = CLASS_E_NOAGGREGATION;
|
|
|
|
if (pUnkOuter == NULL)
|
|
{
|
|
hr = E_OUTOFMEMORY;
|
|
|
|
FrameWorkContextMenuExt *pExt = new (std::nothrow) FrameWorkContextMenuExt();
|
|
if (pExt)
|
|
{
|
|
hr = pExt->QueryInterface(riid, ppv);
|
|
pExt->Release();
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
IFACEMETHODIMP ClassFactory::LockServer(BOOL fLock)
|
|
{
|
|
if (fLock)
|
|
{
|
|
InterlockedIncrement(&g_cDllRef);
|
|
}
|
|
else
|
|
{
|
|
InterlockedDecrement(&g_cDllRef);
|
|
}
|
|
return S_OK;
|
|
}
|
|
|
|
#pragma endregion |