|
|
//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992-1998
//
// File: smart.hxx
//
// Contents: Macro for simple smart pointer
//
// History: 25-Aug-94 KyleP Created
// 24-Oct-94 BartoszM Added template
//
//---------------------------------------------------------------------------
#pragma once
//+---------------------------------------------------------------------------
//
// Class: XPtr<class CItem>
//
// Purpose: Smart Pointer template
//
// History: 24-Oct-94 BartoszM Created
//
// Notes: Usage
//
// XPtr<CWidget> xWidget(pWidget);
// xWidget->WidgetMethod(...);
// CWidget pW = xWidget.Acquire();
//
//----------------------------------------------------------------------------
template<class CItem> class XPtr { public: XPtr(CItem* p = 0) : _p( p ) { }
XPtr ( XPtr<CItem> & x ) { _p = x.Acquire(); }
~XPtr() { delete _p; }
CItem* operator->() { return _p; }
CItem const * operator->() const { return _p; }
BOOL IsNull() const { return (0 == _p); }
void Set ( CItem* p ) { Win4Assert (0 == _p); _p = p; }
CItem * Acquire() { CItem * pTemp = _p; _p = 0; return pTemp; }
CItem & GetReference() const { Win4Assert( 0 != _p ); return *_p; }
CItem * GetPointer() const { return _p; }
void Free() { delete Acquire(); }
private: XPtr<CItem>& operator=( const XPtr<CItem> & x );
CItem * _p; };
//+---------------------------------------------------------------------------
//
// Class: XPtrST<class CItem>
//
// Purpose: Smart Pointer template for Simple Types
//
// History: 12-Mar-96 dlee Created
//
//----------------------------------------------------------------------------
template<class CItem> class XPtrST { public: XPtrST(CItem* p = 0) : _p( p ) { }
~XPtrST() { delete _p; }
BOOL IsNull() const { return ( 0 == _p ); }
void Set ( CItem* p ) { Win4Assert( 0 == _p ); _p = p; }
CItem * Acquire() { CItem * pTemp = _p; _p = 0; return pTemp; }
CItem & GetReference() const { Win4Assert( 0 != _p ); return *_p; }
CItem * GetPointer() const { return _p ; }
void Free() { delete Acquire(); }
private: XPtrST (const XPtrST<CItem> & x); XPtrST<CItem> & operator=( const XPtrST<CItem> & x);
CItem * _p; };
//+---------------------------------------------------------------------------
//
// Class: XBStr
//
// Purpose: Smart BSTR class
//
// History: 05-May-97 KrishnaN Created
//
//----------------------------------------------------------------------------
class XBStr { public: XBStr(BSTR p = 0) : _p( p ) {}
XBStr ( XBStr & x ): _p( x.Acquire() ) {}
~XBStr() { SysFreeString(_p); }
BOOL IsNull() const { return (0 == _p); }
BSTR SetText ( WCHAR const * pOleStr ) { Win4Assert (0 == _p && pOleStr); _p = SysAllocString(pOleStr); if (0 == _p) THROW( CException(E_OUTOFMEMORY) ); return _p; }
void Set ( BSTR pOleStr ) { Win4Assert (0 == _p); _p = pOleStr; }
BSTR Acquire() { BSTR pTemp = _p; _p = 0; return pTemp; }
BSTR GetPointer() const { return _p; }
void Free() { SysFreeString(Acquire()); }
private: BSTR _p; };
//+---------------------------------------------------------------------------
//
// Class: XPipeImpersonation
//
// Purpose: Smart Pointer for named pipe impersonation and revert
//
// History: 4-Oct-96 dlee Created
//
//----------------------------------------------------------------------------
class XPipeImpersonation { public: XPipeImpersonation() : _fImpersonated( FALSE ) { }
XPipeImpersonation( HANDLE hPipe ) : _fImpersonated( FALSE ) { Impersonate( hPipe ); }
void Impersonate( HANDLE hPipe ) { Win4Assert( INVALID_HANDLE_VALUE != hPipe ); Win4Assert( !_fImpersonated );
if ( ! ImpersonateNamedPipeClient( hPipe ) ) THROW( CException() );
_fImpersonated = TRUE; }
~XPipeImpersonation() { Revert(); }
void Revert() { if ( _fImpersonated ) { RevertToSelf(); _fImpersonated = FALSE; } } private: BOOL _fImpersonated; };
//+---------------------------------------------------------------------------
//
// Class: XInterface<class CItem>
//
// Purpose: Smart Pointer template for items Release()'ed, not ~'ed
//
// History: 22-Mar-95 dlee Created
//
//----------------------------------------------------------------------------
template<class CItem> class XInterface { public: XInterface(CItem* p = 0) : _p( p ) { }
~XInterface() { if (0 != _p) _p->Release(); }
CItem* operator->() { return _p; }
CItem const * operator->() const { return _p; }
BOOL IsNull() const { return (0 == _p); }
void Set ( CItem* p ) { Win4Assert (0 == _p); _p = p; }
CItem * Acquire() { CItem * pTemp = _p; _p = 0; return pTemp; }
CItem & GetReference() const { Win4Assert( 0 != _p ); return *_p; }
CItem * GetPointer() const { return _p; }
void ** GetQIPointer() { return (void **)&_p; }
CItem ** GetPPointer() { return &_p; }
IUnknown ** GetIUPointer() { return (IUnknown **) &_p; }
void Free() { CItem *p = Acquire(); if ( 0 != p ) p->Release(); }
private: //
// Do not define this. We don't want people
// doing copies.
//
XInterface (const XInterface<CItem> & x); XInterface<CItem>& operator=(const XInterface<CItem> & x);
CItem * _p; };
//+---------------------------------------------------------------------------
//
// Class: XRtlHeapMem
//
// Purpose: A smart pointer for memory allocated from the process heap.
//
// History: 7-15-96 srikants Created
//
//----------------------------------------------------------------------------
class XRtlHeapMem { public:
XRtlHeapMem( void * pv ) : _pv(pv) { }
~XRtlHeapMem() { _FreeMem(); }
void Set( void * pv ) { _FreeMem(); _pv = pv; }
void * Get() { return _pv; }
private:
void _FreeMem() { if ( _pv ) { RtlFreeHeap( RtlProcessHeap(), 0, _pv ); _pv = 0; } }
void * _pv; // Memory pointer to free
};
//+---------------------------------------------------------------------------
//
// Class: XGlobalAllocMem
//
// Purpose: A smart pointer for GlobalAlloc
//
// History: 2-19-97 mohamedn Created
//
//----------------------------------------------------------------------------
class XGlobalAllocMem { public:
XGlobalAllocMem( HGLOBAL pv = 0 ) : _pv( pv ) { }
~XGlobalAllocMem() { Free(); }
void Set( HGLOBAL pv ) { Win4Assert( 0 == _pv ); _pv = pv; }
HGLOBAL Get() { return _pv; }
HGLOBAL Acquire() { HGLOBAL p = _pv; _pv = 0; return p; }
void Free() { if ( 0 != _pv ) { GlobalFree( _pv ); _pv = 0; } }
private: HGLOBAL _pv; }; //XGlobalAllocMem
//+---------------------------------------------------------------------------
//
// Class: XLocalAllocMem
//
// Purpose: A smart pointer for LocalAlloc
//
// History: 10-25-96 dlee Created
//
//----------------------------------------------------------------------------
class XLocalAllocMem { public:
XLocalAllocMem( void * pv = 0 ) : _pv( pv ) { }
~XLocalAllocMem() { Free(); }
void Set( void * pv ) { Win4Assert( 0 == _pv ); _pv = pv; }
void * Get() { return _pv; }
void * Acquire() { void *p = _pv; _pv = 0; return p; }
void Free() { if ( 0 != _pv ) { LocalFree( (HLOCAL) _pv ); _pv = 0; } }
private: void * _pv; }; //XLocalAllocMem
//+---------------------------------------------------------------------------
//
// Class: XSafeArray
//
// Purpose: A smart pointer for SafeArray
//
// History: 05-01-97 emilyb created
//
//----------------------------------------------------------------------------
class XSafeArray { public:
XSafeArray( SAFEARRAY * psa = 0 ) : _psa( psa ) { }
~XSafeArray() { if ( 0 != _psa ) SafeArrayDestroy(_psa); }
void Set( SAFEARRAY * psa ) { Win4Assert( 0 == _psa ); _psa = psa; }
SAFEARRAY * Get() { return _psa; }
SAFEARRAY * Acquire() { SAFEARRAY * psa = _psa; _psa = 0; return psa; }
void Destroy() { if ( 0 != _psa ) { SafeArrayDestroy(_psa); _psa = 0; } }
private: SAFEARRAY * _psa; }; //XSafeArray
//+-------------------------------------------------------------------------
//
// Template: renewx, function
//
// Synopsis: Re-allocate memory in a type-safe way
//
// Arguments: [ptOld] -- ole block of memory, may be 0
// [cOld] -- old count of items
// [cNew] -- new count of items
//
// Returns: T * pointer to the newly allocated memory
//
//--------------------------------------------------------------------------
template<class T> T * renewx( T * ptOld, ULONG cOld, ULONG cNew ) { if ( cOld == cNew ) { return ptOld; } else { T *ptNew = new T [cNew]; ULONG cMin = __min(cOld,cNew); RtlCopyMemory( ptNew, ptOld, cMin * sizeof T ); delete [] ptOld; return ptNew; } } //renewx
//+---------------------------------------------------------------------------
//
// Class: XFindFirstFile
//
// Purpose: A smart pointer for FindFirstFile
//
// History: 10-25-96 dlee Created
//
//----------------------------------------------------------------------------
class XFindFirstFile { public:
XFindFirstFile( WCHAR const * pwcPath, WIN32_FIND_DATA * pFindData ) { _h = FindFirstFile( pwcPath, pFindData ); }
XFindFirstFile( HANDLE h = INVALID_HANDLE_VALUE ) : _h( h ) {}
~XFindFirstFile() { Free(); }
BOOL IsOK() { return INVALID_HANDLE_VALUE != _h; }
void Set( HANDLE h ) { Win4Assert( INVALID_HANDLE_VALUE == _h ); _h = h; }
HANDLE Get() { return _h; }
HANDLE Acquire() { HANDLE h = _h; _h = INVALID_HANDLE_VALUE; return h; }
void Free() { if ( INVALID_HANDLE_VALUE != _h ) { FindClose( _h ); _h = INVALID_HANDLE_VALUE; } }
private: HANDLE _h; }; //XFindFirstFile
//+---------------------------------------------------------------------------
//
// Class: SHandle
//
// Purpose: Smart handle
//
// History: 17-Jul-95 DwightKr Created
//
// Notes: Usage
//
// SHandle xHandle( hFile )
// HANDLE handle = xHandle.Acquire();
//
//----------------------------------------------------------------------------
class SHandle { public : SHandle(HANDLE handle = INVALID_HANDLE_VALUE) : _handle(handle) { }
~SHandle() { Free(); }
void Free() { if ( INVALID_HANDLE_VALUE != _handle ) { NtClose(_handle); _handle = INVALID_HANDLE_VALUE; } }
HANDLE Acquire() { HANDLE handle = _handle; _handle = INVALID_HANDLE_VALUE;
return handle; }
void Set( HANDLE handle ) { Win4Assert( INVALID_HANDLE_VALUE == _handle );
_handle = handle; }
HANDLE Get() const { return _handle; }
private : HANDLE _handle; };
//+---------------------------------------------------------------------------
//
// Class: SRegKey
//
// Purpose: Smart registy key
//
// History: 12/29/97 dlee created header, author unknown
//
//----------------------------------------------------------------------------
class SRegKey { public: SRegKey( HKEY key ) : _key( key ) {} SRegKey() : _key( 0 ) {} ~SRegKey() { Free(); } void Set( HKEY key ) { Win4Assert( 0 == _key ); _key = key; } HKEY * GetPointer() { Win4Assert( 0 == _key ); return &_key; } HKEY Get() { return _key; } BOOL IsNull() { return ( 0 == _key ); } HKEY Acquire() { HKEY tmp = _key; _key = 0; return tmp; } void Free() { if ( 0 != _key ) { RegCloseKey( _key ); _key = 0; } }
private: HKEY _key; };
//+---------------------------------------------------------------------------
//
// Class: SPropVariant
//
// Purpose: Smart propVariant
//
// History: 01-Jul-96 DwightKr Created
//
// Notes: Usage
//
// SPropVariant xPropVariant(pPropVariant);
// pPropVariant = xPropVariant.Acquire();
//
//----------------------------------------------------------------------------
class SPropVariant { public : SPropVariant(PROPVARIANT * pPropVariant = 0) : _pPropVariant(pPropVariant) { }
~SPropVariant() { if ( 0 != _pPropVariant ) PropVariantClear( _pPropVariant );
_pPropVariant = 0; }
PROPVARIANT * Acquire() { PROPVARIANT * pPropVariant = _pPropVariant; _pPropVariant = 0;
return pPropVariant; }
void Set( PROPVARIANT * pPropVariant ) { Win4Assert( 0 == _pPropVariant );
_pPropVariant = pPropVariant; }
BOOL IsNull() const { return 0 == _pPropVariant; }
PROPVARIANT * Get() const { return _pPropVariant; }
private : PROPVARIANT * _pPropVariant; };
//+-------------------------------------------------------------------------
//
// Class: SWin32Handle
//
// Purpose: Smart pointer to a Win32 HANDLE; insures handle is closed
//
// History: 07-Jun-94 DwightKr Created
//
//--------------------------------------------------------------------------
class SWin32Handle { public: SWin32Handle( HANDLE handle = INVALID_HANDLE_VALUE ) : _handle(handle) {}
~SWin32Handle() { Free(); }
void Free() { if ( INVALID_HANDLE_VALUE != _handle ) { CloseHandle( _handle ); _handle = INVALID_HANDLE_VALUE; } }
void Set( HANDLE h ) { Win4Assert( INVALID_HANDLE_VALUE == _handle ); _handle = h; }
HANDLE Get() { return _handle; }
HANDLE Acquire() { HANDLE h = _handle; _handle = INVALID_HANDLE_VALUE; return h; }
BOOL IsValid() { return INVALID_HANDLE_VALUE != _handle; }
operator HANDLE () { return _handle; };
private: HANDLE _handle; };
//+-------------------------------------------------------------------------
//
// Class: SDacl
//
// Purpose: Smart pointer to a Win32 TOKEN_DEFAULT_DACL; releases storage
//
// History: 07-Jun-94 DwightKr Created
//
//--------------------------------------------------------------------------
class SDacl { public: SDacl( TOKEN_DEFAULT_DACL *pDacl ) : _pDacl(pDacl) {} ~SDacl() { delete _pDacl; }
private: TOKEN_DEFAULT_DACL *_pDacl; };
//+-------------------------------------------------------------------------
//
// Class: CSid
//
// Purpose: Pointer to a Win32 Sid; release the Sid
//
// History: 07-Jun-94 DwightKr Created
//
//--------------------------------------------------------------------------
class CSid { public: CSid( SID_IDENTIFIER_AUTHORITY & NtAuthority, DWORD dwSubauthority ) { if ( !AllocateAndInitializeSid( &NtAuthority, 1, dwSubauthority, 0,0,0,0,0,0,0, &_pSid ) ) { THROW( CException() ); } }
~CSid() { FreeSid( _pSid ); }
PSID Get() { return _pSid; }
operator PSID () { return _pSid; }
private: PSID _pSid; };
//+---------------------------------------------------------------------------
//
// Class: XCoMem<class CItem>
//
// Purpose: Smart Pointer template
//
// History: 24-Oct-94 BartoszM Created
//
// Notes: Usage
//
// XCoMem<CWidget> xWidget(pWidget);
// xWidget->WidgetMethod(...);
// CWidget pW = xWidget.Acquire();
//
//----------------------------------------------------------------------------
template<class CItem> class XCoMem { public: XCoMem(CItem* p = 0) : _p(p) { }
XCoMem(unsigned cItems) : _p(0) { Init( cItems ); }
~XCoMem() { if ( 0 != _p ) CoTaskMemFree( _p ); }
BOOL IsNull() const { return (0 == _p); }
CItem & operator[]( unsigned i ) { return _p[i]; }
void Set ( CItem* p ) { Win4Assert (0 == _p); _p = p; }
CItem * Acquire() { CItem * pTemp = _p; _p = 0; return pTemp; }
CItem & GetReference() const { Win4Assert( 0 != _p ); return *_p; }
CItem * GetPointer() { return _p; }
void Init( unsigned cItems ) { Win4Assert( 0 == _p );
_p = (CItem *) CoTaskMemAlloc( cItems * sizeof CItem ); if ( 0 == _p ) THROW ( CException( E_OUTOFMEMORY ) ); }
void InitNoThrow( unsigned cItems ) { Win4Assert( 0 == _p );
_p = (CItem *) CoTaskMemAlloc( cItems * sizeof CItem ); }
void Free( void ) { if ( 0 != _p ) { CoTaskMemFree( _p ); _p = 0; } }
protected: CItem * _p;
private: XCoMem (const XCoMem<CItem> & x); XCoMem<CItem> & operator=( const XCoMem<CItem> & x);
};
//+---------------------------------------------------------------------------
//
// Class: XLibHandle
//
// Purpose: Smart pointer for an HINSTANCE
//
// History: 4-22-97 KrishnaN Created
//
//----------------------------------------------------------------------------
class XLibHandle {
public:
XLibHandle( HINSTANCE hLib = NULL ) : _hLibHandle( hLib ) {
}
void Set( HINSTANCE hLib ) { Win4Assert( NULL == _hLibHandle ); _hLibHandle = hLib; }
~XLibHandle() { if ( NULL != _hLibHandle ) { FreeLibrary( _hLibHandle ); } }
HINSTANCE Acquire() { HINSTANCE h = _hLibHandle; _hLibHandle = 0; return h; }
HINSTANCE Get() { return _hLibHandle; }
private:
HINSTANCE _hLibHandle; };
//+---------------------------------------------------------------------------
//
// Class: XBitmapHandle
//
// Purpose: Smart pointer for an HBITMAP
//
// History: 4-22-97 KrishnaN Created
//
//----------------------------------------------------------------------------
class XBitmapHandle {
public:
XBitmapHandle( HBITMAP hBmp = NULL ) : _hBmpHandle( hBmp ) {
}
void Set( HBITMAP hBmp ) { Win4Assert( NULL == _hBmpHandle ); _hBmpHandle = hBmp; }
~XBitmapHandle() { if (_hBmpHandle) DeleteObject( _hBmpHandle ); }
HBITMAP Acquire() { HBITMAP h = _hBmpHandle; _hBmpHandle = 0; return h; }
HBITMAP Get() { return _hBmpHandle; } void Free() { HBITMAP h = Acquire(); if (h) DeleteObject(h); }
private:
HBITMAP _hBmpHandle; };
#define DECLARE_SMARTP( T ) typedef XPtr< C##T > X##T;
//+---------------------------------------------------------------------------
//
// Class: CNoErrorMode
//
// Purpose: Turns off popups from the system
//
// History: 4-6-00 dlee Created
//
//----------------------------------------------------------------------------
class CNoErrorMode { public: CNoErrorMode() { _uiOldMode = SetErrorMode( SEM_NOOPENFILEERRORBOX | SEM_FAILCRITICALERRORS ); }
~CNoErrorMode() { SetErrorMode( _uiOldMode ); }
private: UINT _uiOldMode; };
|