windows-nt/Source/XPSP1/NT/termsrv/remdsk/rds/h/standrd.h
2020-09-26 16:20:57 +08:00

379 lines
9.9 KiB
C

#ifndef __standrd_h__
#define __standrd_h__
// Useful macros
#ifndef TRACENOTIMPL
#define TRACENOTIMPL(funcname) TRACE_OUT((_T("%s not implemented.\n"), funcname)); hr = E_NOTIMPL
#endif
#define CONSTANT( x ) enum{ x }
#define CASERET(x) case x: return _T(#x)
#define ClearStruct(lpv) ZeroMemory((LPVOID) (lpv), sizeof(*(lpv)))
#ifndef STRING_RESOURCE_MODULE
# define STRING_RESOURCE_MODULE _Module.GetModuleInstance()
#endif
typedef struct _tagCol {
UINT dwWidth;
LPTSTR lpsz;
} COL;
typedef COL * LPCOL;
inline LPTSTR CopyLPCTSTR( LPCTSTR sz )
{
LPTSTR newString = new TCHAR[ lstrlen( sz ) + 1 ];
if( !lstrcpy( newString, sz ) )
{
// Somethnig fialide
delete [] newString;
newString = NULL;
}
return newString;
}
#ifndef CchMax
#define CchMax(pcsz) (sizeof(pcsz) / sizeof((pcsz)[0]))
#endif // CchMax
#define MAX_RESOURCE_STRING_LEN 256
/* C O N V E R T S Z C H */
/*-------------------------------------------------------------------------
%%Function: ConvertSzCh
Replace every instance of chSrc to chDest in the string
-------------------------------------------------------------------------*/
inline VOID ConvertSzCh(LPTSTR psz, TCHAR chSrc, TCHAR chDest)
{
while (_T('\0') != *psz)
{
if (chSrc == *psz)
{
*psz = chDest;
psz++;
}
else
{
psz = CharNext(psz);
}
}
}
inline VOID ConvertSzCh(LPTSTR psz, TCHAR chSrc = _T('|'), TCHAR chDest = _T('\0'));
inline HRESULT NmCtlLoadString(UINT id, LPTSTR lpsz, UINT cch)
{
HRESULT hr = S_OK;
if( NULL != STRING_RESOURCE_MODULE )
{
if( NULL != lpsz )
{
if (0 == ::LoadString(STRING_RESOURCE_MODULE, id, lpsz, cch))
{
ERROR_OUT(("*** Resource %d does not exist", id));
*lpsz = _T('\0');
hr = HRESULT_FROM_WIN32( ::GetLastError() );
}
}
else
{
ERROR_OUT(("LoadString passed an empty buffer"));
hr = E_INVALIDARG;
}
}
else
{
ERROR_OUT(("LoadString could not find the module"));
hr = E_UNEXPECTED;
}
return hr;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// this works if you have a member variable CComBSTR m_bstrProp ( substitute Prop for the Prop param )
// Example:
//
// CComBSTR m_bstrName;
//
//
// DECLARE_CCOMBSTR_PROPPUT( Name, DISPID_PROP_NAME );
// DECLARE_CCOMBSTR_PROPGET( Name );
//
#define DECLARE_CCOMBSTR_PROPPUT( Prop, PROP_DISPID ) \
STDMETHOD(put_##Prop)( BSTR newVal ) \
{\
HRESULT hr = S_OK;\
if( S_OK == __ATL_PROP_NOTIFY_EVENT_CLASS::FireOnRequestEdit(GetUnknown(), PROP_DISPID) )\
{\
m_bstr##Prop = newVal;\
hr = __ATL_PROP_NOTIFY_EVENT_CLASS::FireOnChanged(GetUnknown(), PROP_DISPID);\
}\
return hr; \
}
#define DECLARE_CCOMBSTR_PROPGET( Prop ) \
STDMETHOD(get_##Prop)( BSTR *pVal ) \
{\
if( pVal )\
{\
*pVal = m_bstr##Prop.Copy();\
}\
else\
{\
return E_POINTER;\
}\
return S_OK;\
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
// this works if you have a member variable <class with iterator> m_aryProp ( substitute Prop for the Prop param )
// Example:
//
// lst<IUnknown*> m_AryName;
//
//
// DECLARE_SAFEARRAY_UNK_PROPPUT( Name, DISPID_PROP_NAME );
// DECLARE_SAFEARRAY_UNK_PROPGET( Name );
//
#define DECLARE_SAFEARRAY_UNK_PROPPUT( Prop, PROP_DISPID ) \
STDMETHOD(put_##Prop)( SAFEARRAY newVal ) \
{\
HRESULT hr = S_OK;\
if( S_OK == __ATL_PROP_NOTIFY_EVENT_CLASS::FireOnRequestEdit(GetUnknown(), PROP_DISPID) )\
{\
lst<IUnknown*>::iterator I = m_ary##Prop.begin();\
while( I != m_ary##Prop.end() )\
{\
(*I)->Release();\
++I;\
}\
m_ary##Prop.erase(m_ary##Prop.begin(), m_ary##Prop.end());\
IUnknown** ppUnkArray;\
SafeArrayAccessData( &newVal, reinterpret_cast<void**>(&ppUnkArray) );\
for (UINT x = 0; x < newVal.rgsabound->cElements; x++)\
{\
IUnknown* pUnk = ppUnkArray[x];\
pUnk->AddRef();\
m_ary##Prop.push_back( pUnk );\
}\
SafeArrayUnaccessData(&newVal);\
hr = __ATL_PROP_NOTIFY_EVENT_CLASS::FireOnChanged(GetUnknown(), PROP_DISPID);\
}\
return hr; \
}
#define DECLARE_SAFEARRAY_UNK_PROPGET( Prop ) \
STDMETHOD(get_##Prop)( SAFEARRAY *pVal ) \
{\
if( pVal )\
{\
int nItems = m_ary##Prop.size();\
SAFEARRAYBOUND bounds = { nItems, 0 };\
pVal = SafeArrayCreate( VT_UNKNOWN, 1, &bounds );\
IUnknown** ppUnkArray;\
SafeArrayAccessData( pVal, reinterpret_cast<void**>(&ppUnkArray) );\
lst<IUnknown*>::iterator I = m_ary##Prop.begin();\
for( int i = 0; I != m_ary##Prop.end(); ++I, ++i )\
{\
ppUnkArray[i] = (*I);\
}\
SafeArrayUnaccessData(pVal);\
}\
else\
{\
return E_POINTER;\
}\
return S_OK;\
}
///////////////////////////////////////////////////////////////////////////////////////////////////////
// The following DECLARE_PROPXXX macros define functions if you have a member variable that supports
// an issignment operator ( cleaning up memory if need be....
#define DECLARE_PROPPUT( Type, lVal, Prop, PROP_DISPID ) \
STDMETHOD(put_##Prop)( Type newVal ) \
{\
HRESULT hr = S_OK;\
if( S_OK == __ATL_PROP_NOTIFY_EVENT_CLASS::FireOnRequestEdit(GetUnknown(), PROP_DISPID) )\
{\
lVal = newVal;\
hr = __ATL_PROP_NOTIFY_EVENT_CLASS::FireOnChanged(GetUnknown(), PROP_DISPID);\
}\
return hr; \
}
#define DECLARE_PROPGET( Type, rVal, Prop ) \
STDMETHOD(get_##Prop)( Type* pVal )\
{\
if( pVal )\
{\
*pVal = rVal;\
}\
else\
{\
return E_POINTER;\
}\
return S_OK;\
}
inline HRESULT GetTextBoxHeight( HWND hwnd, int* pcy )
{
HRESULT hr = S_OK;
HDC hdc = NULL;
HFONT hSysFont = NULL;
HFONT hOldFont = NULL;
TEXTMETRIC tm;
int HeightOfCurrentFont = 0;
int HeightOfSystemFont = 0;
if( pcy )
{
if( IsWindow( hwnd ) )
{
//get the DC for the control
hdc = GetDC(hwnd);
//get the metrics for the system font
hSysFont = reinterpret_cast<HFONT>(GetStockObject(SYSTEM_FONT));
hOldFont = reinterpret_cast<HFONT>(SelectObject(hdc, hSysFont));
GetTextMetrics(hdc, &tm);
HeightOfSystemFont = tm.tmHeight;
//select the original font back into the DC and release the DC
SelectObject(hdc, hOldFont);
DeleteObject(hSysFont);
GetTextMetrics(hdc, &tm);
ReleaseDC(hwnd, hdc);
HeightOfCurrentFont = tm.tmHeight;
*pcy = HeightOfCurrentFont +
( min( HeightOfSystemFont, HeightOfCurrentFont ) >> 1 ) +
(GetSystemMetrics(SM_CYEDGE) * 2);
}
else
{
hr = E_INVALIDARG;
}
}
else
{
hr = E_POINTER;
}
return hr;
}
#define RES_CH_MAX 256
inline TCHAR* Res2THelper( UINT uID, TCHAR* psz, int cch )
{
if( LoadString( STRING_RESOURCE_MODULE, uID, psz, cch ) )
{
return psz;
}
return _T("");
}
#ifndef RES2T
#define RES2T(uID) ( Res2THelper( uID, static_cast<TCHAR*>(_alloca( RES_CH_MAX )), RES_CH_MAX ) )
#endif
inline LPCTSTR CommDlgLastErrorToa( DWORD dwErr )
{
switch( dwErr )
{
CASERET ( CDERR_DIALOGFAILURE );
CASERET ( CDERR_GENERALCODES );
CASERET ( CDERR_STRUCTSIZE );
CASERET ( CDERR_INITIALIZATION );
CASERET ( CDERR_NOTEMPLATE );
CASERET ( CDERR_NOHINSTANCE );
CASERET ( CDERR_LOADSTRFAILURE );
CASERET ( CDERR_FINDRESFAILURE );
CASERET ( CDERR_LOADRESFAILURE );
CASERET ( CDERR_LOCKRESFAILURE );
CASERET ( CDERR_MEMALLOCFAILURE );
CASERET ( CDERR_MEMLOCKFAILURE );
CASERET ( CDERR_NOHOOK );
CASERET ( CDERR_REGISTERMSGFAIL );
CASERET ( PDERR_PRINTERCODES );
CASERET ( PDERR_SETUPFAILURE );
CASERET ( PDERR_PARSEFAILURE );
CASERET ( PDERR_RETDEFFAILURE );
CASERET ( PDERR_LOADDRVFAILURE );
CASERET ( PDERR_GETDEVMODEFAIL );
CASERET ( PDERR_INITFAILURE );
CASERET ( PDERR_NODEVICES );
CASERET ( PDERR_NODEFAULTPRN );
CASERET ( PDERR_DNDMMISMATCH );
CASERET ( PDERR_CREATEICFAILURE );
CASERET ( PDERR_PRINTERNOTFOUND );
CASERET ( PDERR_DEFAULTDIFFERENT );
CASERET ( CFERR_CHOOSEFONTCODES );
CASERET ( CFERR_NOFONTS );
CASERET ( CFERR_MAXLESSTHANMIN );
CASERET ( FNERR_FILENAMECODES );
CASERET ( FNERR_SUBCLASSFAILURE );
CASERET ( FNERR_INVALIDFILENAME );
CASERET ( FNERR_BUFFERTOOSMALL );
CASERET ( FRERR_FINDREPLACECODES );
CASERET ( FRERR_BUFFERLENGTHZERO );
CASERET ( CCERR_CHOOSECOLORCODES );
}
return _T("NOERROR");
}
inline void DumpCommDlgLastError()
{
ATLTRACE(_T("CommDlgExtendedError == %s"), CommDlgLastErrorToa( CommDlgExtendedError() ));
}
inline int _Points_From_LogFontHeight( int height, HWND hwnd )
{
HDC hdc = ::GetDC( hwnd );
if( NULL != hdc )
{
int iRet = MulDiv( -height, 72, GetDeviceCaps( hdc, LOGPIXELSY ) );
::ReleaseDC( hwnd, hdc );
return iRet;
}
return 0;
}
#endif // __standrd_h__