JD2022-TU1/main/tools/legacy/UA_Configure/FrameworkShellDLL/ClassFactory.cpp

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