windows-nt/Source/XPSP1/NT/admin/activec/samples/benefits/atltask.h
2020-09-26 16:20:57 +08:00

301 lines
7.3 KiB
C++

//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1999 - 1999
//
// File: atltask.h
//
//--------------------------------------------------------------------------
#ifndef _ATL_TASKPAD_H_
#define _ATL_TASKPAD_H_
#include "SnapHelp.h"
//
// Derive from this class if you'd like to use the
// IExtendTaskpadImpl implementation in your snap-in.
//
class CTaskpadItem
{
public:
//
// Should be overridden by client.
//
STDMETHOD( TaskNotify )( IConsole* pConsole, VARIANT* arg, VARIANT* param )
{
UNUSED_ALWAYS( arg );
UNUSED_ALWAYS( param );
return( E_NOTIMPL );
}
//
// Should be overridden by client.
//
STDMETHOD( EnumTasks )( LPOLESTR szTaskGroup, IEnumTASK** ppEnumTASK )
{
UNUSED_ALWAYS( szTaskGroup );
UNUSED_ALWAYS( ppEnumTASK );
return( E_NOTIMPL );
}
protected:
//
// Given a destination and source task list, this copies the
// strings using CoTaskMemAlloc, and also adds module file path
// information as appropriate.
//
int CoTasksDup( MMC_TASK* pDestTasks, MMC_TASK* pSrcTasks, int nNumTasks )
{
USES_CONVERSION;
_ASSERTE( pDestTasks != NULL );
_ASSERTE( pSrcTasks != NULL );
_ASSERTE( nNumTasks > 0 );
int nCopied = 0;
TCHAR szImagesPath[ _MAX_PATH * 2 ];
TCHAR szBuf[ _MAX_PATH * 2 ];
try
{
//
// Get the path of our module.
//
_tcscpy( szImagesPath, _T( "res://" ) );
if ( GetModuleFileName( _Module.GetModuleInstance(), szImagesPath + _tcslen( szImagesPath ), MAX_PATH ) == 0 )
throw;
//
// Append another seperator.
//
_tcscat( szImagesPath, _T( "/" ) );
//
// Initialize the destination tasks.
//
memset( pDestTasks, 0, sizeof( MMC_TASK ) * nNumTasks );
//
// Loop through and copy each appropriate task.
//
for ( int i = 0; i < nNumTasks; i++ )
{
//
// Copy the display object.
//
switch( pSrcTasks[ i ].sDisplayObject.eDisplayType )
{
case MMC_TASK_DISPLAY_TYPE_SYMBOL:
pDestTasks[ i ].sDisplayObject.uSymbol.szFontFamilyName = CoTaskDupString( pSrcTasks[ i ].sDisplayObject.uSymbol.szFontFamilyName );
pDestTasks[ i ].sDisplayObject.uSymbol.szURLtoEOT = CoTaskDupString( pSrcTasks[ i ].sDisplayObject.uSymbol.szURLtoEOT );
pDestTasks[ i ].sDisplayObject.uSymbol.szSymbolString = CoTaskDupString( pSrcTasks[ i ].sDisplayObject.uSymbol.szSymbolString );
break;
default:
_tcscpy( szBuf, szImagesPath );
_tcscat( szBuf, W2T( pSrcTasks[ i ].sDisplayObject.uBitmap.szMouseOverBitmap ) );
pDestTasks[ i ].sDisplayObject.uBitmap.szMouseOverBitmap = CoTaskDupString( T2W( szBuf ) );
_tcscpy( szBuf, szImagesPath );
_tcscat( szBuf, W2T( pSrcTasks[ i ].sDisplayObject.uBitmap.szMouseOffBitmap ) );
pDestTasks[ i ].sDisplayObject.uBitmap.szMouseOffBitmap = CoTaskDupString( T2W( szBuf ) );
break;
}
//
// Copy the display type.
//
pDestTasks[ i ].sDisplayObject.eDisplayType = MMC_TASK_DISPLAY_TYPE_BITMAP;
//
// Copy the help string.
//
pDestTasks[ i ].szHelpString = CoTaskDupString( pSrcTasks[ i ].szHelpString );
//
// Handle the button text.
//
pDestTasks[ i ].szText = CoTaskDupString( pSrcTasks[ i ].szText );
//
// Handle the action type.
//
pDestTasks[ i ].eActionType = pSrcTasks[ i ].eActionType;
//
// Based on the action type, handle the appropriate union member.
//
switch( pDestTasks[ i ].eActionType )
{
case MMC_ACTION_ID:
pDestTasks[ i ].nCommandID = pSrcTasks[ i ].nCommandID;
break;
case MMC_ACTION_LINK:
pDestTasks[ i ].szActionURL = CoTaskDupString( pSrcTasks[ i ].szActionURL );
break;
case MMC_ACTION_SCRIPT:
pDestTasks[ i ].szScript = CoTaskDupString( pSrcTasks[ i ].szScript );
break;
}
//
// Increment our successful copy.
//
nCopied++;
}
}
catch(...)
{
//
// Likely thrown by the cotaskdup() allocations.
//
}
return( nCopied );
}
};
template <class T>
class ATL_NO_VTABLE IExtendTaskPadImpl : public IExtendTaskPad
{
public:
STDMETHOD( TaskNotify )( LPDATAOBJECT pdo, VARIANT* arg, VARIANT* param)
{
HRESULT hr = E_POINTER;
T* pT = static_cast<T*>(this);
CSnapInItem* pItem;
DATA_OBJECT_TYPES type;
//
// Retrieve the data class from the passed in object.
//
hr = pT->m_pComponentData->GetDataClass( pdo, &pItem, &type );
if (SUCCEEDED(hr))
{
CTaskpadItem* pTaskpadItem = dynamic_cast< CTaskpadItem* >( pItem );
if ( pTaskpadItem )
{
//
// We're guaranteed that the passed in object will be one
// of ours since we should have derived from it.
//
hr = pTaskpadItem->TaskNotify( pT->m_spConsole, arg, param );
}
}
return( hr );
}
STDMETHOD( EnumTasks )( IDataObject * pdo, LPOLESTR szTaskGroup, IEnumTASK** ppEnumTASK )
{
HRESULT hr = E_POINTER;
T* pT = static_cast<T*>(this);
CSnapInItem* pItem;
DATA_OBJECT_TYPES type;
//
// Retrieve the data class from the passed in object.
//
hr = pT->m_pComponentData->GetDataClass( pdo, &pItem, &type );
if (SUCCEEDED(hr))
{
CTaskpadItem* pTaskpadItem = dynamic_cast< CTaskpadItem* >( pItem );
if ( pTaskpadItem )
{
//
// We're guaranteed that the passed in object will be one
// of ours since we should have derived from it.
//
hr = pTaskpadItem->EnumTasks( szTaskGroup, ppEnumTASK );
}
}
return( hr );
}
STDMETHOD( GetTitle )( LPOLESTR pszGroup, LPOLESTR * pszTitle )
{
UNUSED_ALWAYS( pszGroup );
USES_CONVERSION;
HRESULT hr = E_FAIL;
T* pT = static_cast<T*>(this);
try
{
//
// Allocate memory for the title.
//
*pszTitle = (LPOLESTR) CoTaskMemAlloc( ( wcslen( pT->m_pszTitle ) + 1 ) * sizeof( OLECHAR ) );
if ( pszTitle == NULL )
throw;
//
// Copy the title.
//
wcscpy( *pszTitle, pT->m_pszTitle );
hr = S_OK;
}
catch( ... )
{
}
return( hr );
}
STDMETHOD( GetBackground )( LPOLESTR pszGroup, MMC_TASK_DISPLAY_OBJECT * pTDO )
{
UNUSED_ALWAYS( pszGroup );
USES_CONVERSION;
HRESULT hr = E_FAIL;
T* pT = static_cast<T*>(this);
TCHAR szModulePath[ _MAX_PATH ];
OLECHAR szBackgroundPath[ _MAX_PATH ];
try
{
//
// In the taskpad case, the module path of MMC.EXE should be
// obtained. Use the template contained therein.
//
if ( GetModuleFileName( _Module.GetModuleInstance(), szModulePath, _MAX_PATH ) == 0 )
throw;
//
// Append the necessary decorations for correct access.
//
wcscpy( szBackgroundPath, L"res://" );
wcscat( szBackgroundPath, T2W( szModulePath ) );
wcscat( szBackgroundPath, L"/" );
wcscat( szBackgroundPath, pT->m_pszBackgroundPath );
pTDO->eDisplayType = MMC_TASK_DISPLAY_TYPE_BITMAP;
pTDO->uBitmap.szMouseOverBitmap = CoTaskDupString( szBackgroundPath );
if ( pTDO->uBitmap.szMouseOverBitmap == NULL )
throw;
pTDO->uBitmap.szMouseOffBitmap = NULL;
hr = S_OK;
}
catch( ... )
{
}
return( hr );
}
STDMETHOD( GetDescriptiveText )( LPOLESTR pszGroup, LPOLESTR * pszDescriptiveText )
{
UNUSED_ALWAYS( pszGroup );
UNUSED_ALWAYS( pszDescriptiveText );
return( E_NOTIMPL );
}
STDMETHOD( GetListPadInfo )( LPOLESTR pszGroup, MMC_LISTPAD_INFO * lpListPadInfo )
{
UNUSED_ALWAYS( pszGroup );
UNUSED_ALWAYS( lpListPadInfo );
return( E_NOTIMPL );
}
};
#endif