windows-nt/Source/XPSP1/NT/shell/ext/ftp/ftpglob.cpp
2020-09-26 16:20:57 +08:00

119 lines
2.3 KiB
C++

/**************************************************************\
FILE: ftpglob.cpp
DESCRIPTION:
Refcounted HGLOBAL.
\**************************************************************/
#include "priv.h"
#include "ftpglob.h"
/****************************************************\
Constructor
\****************************************************/
CFtpGlob::CFtpGlob() : m_cRef(1)
{
DllAddRef();
// This needs to be allocated in Zero Inited Memory.
// Assert that all Member Variables are inited to Zero.
ASSERT(!m_hglob);
LEAK_ADDREF(LEAK_CFtpGlob);
}
/****************************************************\
Destructor
\****************************************************/
CFtpGlob::~CFtpGlob()
{
if (m_hglob)
GlobalFree(m_hglob);
DllRelease();
LEAK_DELREF(LEAK_CFtpGlob);
}
//===========================
// *** IUnknown Interface ***
ULONG CFtpGlob::AddRef()
{
m_cRef++;
return m_cRef;
}
ULONG CFtpGlob::Release()
{
ASSERT(m_cRef > 0);
m_cRef--;
if (m_cRef > 0)
return m_cRef;
delete this;
return 0;
}
HRESULT CFtpGlob::QueryInterface(REFIID riid, void **ppvObj)
{
if (IsEqualIID(riid, IID_IUnknown))
{
*ppvObj = SAFECAST(this, IUnknown*);
}
else
{
TraceMsg(TF_FTPQI, "CFtpGlob::QueryInterface() failed.");
*ppvObj = NULL;
return E_NOINTERFACE;
}
AddRef();
return S_OK;
}
/****************************************************\
FUNCTION: CFtpGlob_Create
DESCRIPTION:
This function will create an instance of the
CFtpGlob object.
\****************************************************/
IUnknown * CFtpGlob_Create(HGLOBAL hglob)
{
IUnknown * punk = NULL;
CFtpGlob * pfg = new CFtpGlob();
if (pfg)
{
pfg->m_hglob = hglob;
pfg->QueryInterface(IID_IUnknown, (LPVOID *)&punk);
pfg->Release();
}
return punk;
}
/****************************************************\
FUNCTION: CFtpGlob_CreateStr
DESCRIPTION:
This function will create an instance of the
CFtpGlob object.
\****************************************************/
CFtpGlob * CFtpGlob_CreateStr(LPCTSTR pszStr)
{
CFtpGlob * pfg = new CFtpGlob();
if (EVAL(pfg))
pfg->m_hglob = (HGLOBAL) pszStr;
return pfg;
}