windows-nt/Source/XPSP1/NT/shell/ext/cabview/unknown.h
2020-09-26 16:20:57 +08:00

111 lines
2.3 KiB
C++

//*******************************************************************************************
//
// Filename : Unknown.h
//
// Definitions for some customized routines
//
// Copyright (c) 1994 - 1996 Microsoft Corporation. All rights reserved
//
//*******************************************************************************************
#ifndef _UNKNOWN_H_
#define _UNKNOWN_H_
class CUnknown
{
public:
CUnknown() {}
virtual ~CUnknown(); // virtual destructor called from Release
HRESULT QIHelper(REFIID riid, LPVOID *ppvObj, const IID *apiid[], LPUNKNOWN aobj[]);
ULONG AddRefHelper();
ULONG ReleaseHelper();
private:
CRefCount m_cRef;
CRefDll m_cRefDll;
} ;
// Only for ensuring Release in all control paths
class CEnsureRelease
{
public:
CEnsureRelease(IUnknown *pUnk) : m_pUnk(pUnk) {}
~CEnsureRelease() {if (m_pUnk) m_pUnk->Release();}
operator IUnknown*() {return(m_pUnk);}
void Attach(IUnknown *pUnk) {m_pUnk = pUnk;}
private:
IUnknown *m_pUnk;
} ;
class CObjTemp
{
public:
CObjTemp() : m_hObj(0) {}
~CObjTemp() {}
operator HANDLE() const {return(m_hObj);}
HANDLE Attach(HANDLE hObjNew) {HANDLE hObj=m_hObj; m_hObj=hObjNew; return(hObj);}
HANDLE Detach() {return(Attach(0));}
protected:
HANDLE m_hObj;
} ;
class CMenuTemp : public CObjTemp
{
public:
CMenuTemp() : CObjTemp() {}
CMenuTemp(HMENU hm) : CObjTemp() {Attach(hm);}
~CMenuTemp() {if (m_hObj) DestroyMenu(Detach());}
operator HMENU() const {return((HMENU)m_hObj);}
HMENU Attach(HMENU hObjNew) {return((HMENU)CObjTemp::Attach((HANDLE)hObjNew));}
HMENU Detach() {return((HMENU)CObjTemp::Detach());}
BOOL CreatePopupMenu() {Attach(::CreatePopupMenu()); return(m_hObj!=NULL);}
} ;
class CGotGlobal : public CObjTemp
{
public:
CGotGlobal(HGLOBAL hData, IUnknown *pUnk) : m_erData(pUnk) {Attach(hData);}
~CGotGlobal() {if (!(IUnknown*)m_erData) GlobalFree(m_hObj);}
private:
CEnsureRelease m_erData;
} ;
class CHIDA : public CGotGlobal
{
public:
CHIDA(HGLOBAL hIDA, IUnknown *pUnk) : CGotGlobal(hIDA, pUnk)
{
m_lpIDA = (LPIDA)GlobalLock(hIDA);
}
~CHIDA() {GlobalUnlock(m_hObj);}
LPCITEMIDLIST operator [](UINT nIndex)
{
if (!m_lpIDA || nIndex>m_lpIDA->cidl)
{
return(NULL);
}
return((LPCITEMIDLIST)(((LPSTR)m_lpIDA)+m_lpIDA->aoffset[nIndex]));
}
int GetCount() {return(m_lpIDA ? m_lpIDA->cidl : 0);}
private:
LPIDA m_lpIDA;
} ;
#endif // _UNKNOWN_H_