423 lines
7.1 KiB
C++
423 lines
7.1 KiB
C++
|
//
|
||
|
// Copyright 2001 - Microsoft Corporation
|
||
|
//
|
||
|
//
|
||
|
// Created By:
|
||
|
// Geoff Pease (GPease) 23-JAN-2001
|
||
|
//
|
||
|
// Maintained By:
|
||
|
// Geoff Pease (GPease) 23-JAN-2001
|
||
|
//
|
||
|
#include "pch.h"
|
||
|
#include "DocProp.h"
|
||
|
#include "DefProp.h"
|
||
|
#include "IEditVariantsInPlace.h"
|
||
|
#include "PropertyCacheItem.h"
|
||
|
#include "PropertyCache.h"
|
||
|
#include "AdvancedDlg.h"
|
||
|
#include "SimpleDlg.h"
|
||
|
#include "SummaryPage.h"
|
||
|
#pragma hdrstop
|
||
|
|
||
|
DEFINE_THISCLASS( "CDocPropShExt" )
|
||
|
|
||
|
|
||
|
// ************************************************************************
|
||
|
//
|
||
|
// Constructor / Destructor
|
||
|
//
|
||
|
// ************************************************************************
|
||
|
|
||
|
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
HRESULT
|
||
|
CDocPropShExt::CreateInstance(
|
||
|
IUnknown ** ppunkOut
|
||
|
)
|
||
|
{
|
||
|
TraceFunc( "" );
|
||
|
|
||
|
HRESULT hr;
|
||
|
|
||
|
Assert( ppunkOut != NULL );
|
||
|
|
||
|
CDocPropShExt * pthis = new CDocPropShExt;
|
||
|
if ( pthis != NULL )
|
||
|
{
|
||
|
hr = THR( pthis->Init( ) );
|
||
|
if ( SUCCEEDED( hr ) )
|
||
|
{
|
||
|
*ppunkOut = (IShellExtInit *) pthis;
|
||
|
(*ppunkOut)->AddRef( );
|
||
|
}
|
||
|
|
||
|
pthis->Release( );
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
}
|
||
|
|
||
|
HRETURN( hr );
|
||
|
|
||
|
}
|
||
|
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
CDocPropShExt::CDocPropShExt( void )
|
||
|
: _cRef( 1 )
|
||
|
{
|
||
|
TraceFunc( "" );
|
||
|
|
||
|
InterlockedIncrement( &g_cObjects );
|
||
|
|
||
|
TraceFuncExit();
|
||
|
|
||
|
}
|
||
|
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
HRESULT
|
||
|
CDocPropShExt::Init( void )
|
||
|
{
|
||
|
TraceFunc( "" );
|
||
|
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
// IUnknown stuff
|
||
|
Assert( _cRef == 1 );
|
||
|
|
||
|
// IShellExtInit stuff
|
||
|
|
||
|
// IShellPropSheetExt stuff
|
||
|
|
||
|
HRETURN( hr );
|
||
|
|
||
|
}
|
||
|
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
CDocPropShExt::~CDocPropShExt( )
|
||
|
{
|
||
|
TraceFunc( "" );
|
||
|
|
||
|
if ( NULL != _punkSummary )
|
||
|
{
|
||
|
_punkSummary->Release( );
|
||
|
}
|
||
|
|
||
|
InterlockedDecrement( &g_cObjects );
|
||
|
|
||
|
TraceFuncExit();
|
||
|
|
||
|
}
|
||
|
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
HRESULT
|
||
|
CDocPropShExt::RegisterShellExtensions(
|
||
|
BOOL fRegisterIn
|
||
|
)
|
||
|
{
|
||
|
TraceFunc( "" );
|
||
|
|
||
|
HRESULT hr;
|
||
|
LONG lr;
|
||
|
LPTSTR psz;
|
||
|
DWORD cbSize;
|
||
|
|
||
|
HKEY hkeyHandlers = NULL;
|
||
|
HKEY hkeySummary = NULL;
|
||
|
|
||
|
LPOLESTR pszCLSID = NULL;
|
||
|
|
||
|
const TCHAR szSummaryPropertyPageExtName[] = TEXT("Summary Properties Page");
|
||
|
|
||
|
//
|
||
|
// Convert the CLSID to a string
|
||
|
//
|
||
|
|
||
|
hr = THR( StringFromCLSID( CLSID_DocPropShellExtension, &pszCLSID ) );
|
||
|
if ( FAILED( hr ) )
|
||
|
goto Cleanup;
|
||
|
|
||
|
#ifdef UNICODE
|
||
|
psz = pszCLSID;
|
||
|
#else // ASCII
|
||
|
CHAR szCLSID[ 40 ];
|
||
|
|
||
|
wcstombs( szCLSID, pszCLSID, StrLenW( pszCLSID ) + 1 );
|
||
|
psz = szCLSID;
|
||
|
#endif // UNICODE
|
||
|
|
||
|
//
|
||
|
// Open the "*\shellex\PropertySheetHandlers" under HKCR
|
||
|
//
|
||
|
|
||
|
lr = TW32( RegOpenKey( HKEY_CLASSES_ROOT, TEXT("*\\shellex\\PropertySheetHandlers"), &hkeyHandlers ) );
|
||
|
if ( ERROR_SUCCESS != lr )
|
||
|
goto Win32Error;
|
||
|
|
||
|
//
|
||
|
// Create the CLSID key
|
||
|
//
|
||
|
|
||
|
lr = TW32( RegCreateKey( hkeyHandlers, psz, &hkeySummary ) );
|
||
|
if ( ERROR_SUCCESS != lr )
|
||
|
goto Win32Error;
|
||
|
|
||
|
//
|
||
|
// Give the default property a non-localizable name
|
||
|
//
|
||
|
|
||
|
cbSize = sizeof(szSummaryPropertyPageExtName);
|
||
|
lr = TW32( RegSetValueEx( hkeySummary, NULL, 0, REG_SZ, (LPBYTE) szSummaryPropertyPageExtName, cbSize ) );
|
||
|
if ( ERROR_SUCCESS != lr )
|
||
|
goto Win32Error;
|
||
|
|
||
|
Cleanup:
|
||
|
if ( NULL != pszCLSID )
|
||
|
{
|
||
|
CoTaskMemFree( pszCLSID );
|
||
|
}
|
||
|
if ( NULL != hkeyHandlers )
|
||
|
{
|
||
|
RegCloseKey( hkeyHandlers );
|
||
|
}
|
||
|
if ( NULL != hkeySummary )
|
||
|
{
|
||
|
RegCloseKey( hkeySummary );
|
||
|
}
|
||
|
|
||
|
HRETURN( hr );
|
||
|
|
||
|
Win32Error:
|
||
|
hr = HRESULT_FROM_WIN32( lr );
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
// ************************************************************************
|
||
|
//
|
||
|
// IUnknown
|
||
|
//
|
||
|
// ************************************************************************
|
||
|
|
||
|
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
STDMETHODIMP
|
||
|
CDocPropShExt::QueryInterface(
|
||
|
REFIID riid,
|
||
|
LPVOID *ppv
|
||
|
)
|
||
|
{
|
||
|
TraceQIFunc( riid, ppv );
|
||
|
|
||
|
HRESULT hr = E_NOINTERFACE;
|
||
|
|
||
|
if ( IsEqualIID( riid, __uuidof(IUnknown) ) )
|
||
|
{
|
||
|
*ppv = static_cast< IShellExtInit * >( this );
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
else if ( IsEqualIID( riid, __uuidof(IShellExtInit) ) )
|
||
|
{
|
||
|
*ppv = TraceInterface( __THISCLASS__, IShellExtInit, this, 0 );
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
else if ( IsEqualIID( riid, __uuidof(IShellPropSheetExt) ) )
|
||
|
{
|
||
|
*ppv = TraceInterface( __THISCLASS__, IShellPropSheetExt, this, 0 );
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
|
||
|
if ( SUCCEEDED( hr ) )
|
||
|
{
|
||
|
((IUnknown*) *ppv)->AddRef( );
|
||
|
}
|
||
|
|
||
|
QIRETURN( hr, riid );
|
||
|
|
||
|
}
|
||
|
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
STDMETHODIMP_(ULONG)
|
||
|
CDocPropShExt::AddRef( void )
|
||
|
{
|
||
|
TraceFunc( "[IUnknown]" );
|
||
|
|
||
|
_cRef ++; // apartment
|
||
|
|
||
|
RETURN( _cRef );
|
||
|
|
||
|
}
|
||
|
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
STDMETHODIMP_(ULONG)
|
||
|
CDocPropShExt::Release( void )
|
||
|
{
|
||
|
TraceFunc( "[IUnknown]" );
|
||
|
|
||
|
_cRef --; // apartment
|
||
|
|
||
|
if ( 0 != _cRef )
|
||
|
RETURN( _cRef );
|
||
|
|
||
|
delete this;
|
||
|
|
||
|
RETURN( 0 );
|
||
|
}
|
||
|
|
||
|
|
||
|
// ************************************************************************
|
||
|
//
|
||
|
// IShellExtInit
|
||
|
//
|
||
|
// ************************************************************************
|
||
|
|
||
|
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
STDMETHODIMP
|
||
|
CDocPropShExt::Initialize(
|
||
|
LPCITEMIDLIST pidlFolderIn
|
||
|
, LPDATAOBJECT lpdobjIn
|
||
|
, HKEY hkeyProgIDIn
|
||
|
)
|
||
|
{
|
||
|
TraceFunc( "" );
|
||
|
|
||
|
HRESULT hr;
|
||
|
|
||
|
HRESULT hrResult = E_FAIL; // returned to caller - assume failure
|
||
|
|
||
|
hr = THR( CSummaryPage::CreateInstance( &_punkSummary ) );
|
||
|
if ( S_OK == hr )
|
||
|
{
|
||
|
IShellExtInit * psei;
|
||
|
|
||
|
hr = THR( _punkSummary->TYPESAFEQI( psei ) );
|
||
|
if ( S_OK == hr )
|
||
|
{
|
||
|
hr = THR( psei->Initialize( pidlFolderIn, lpdobjIn, hkeyProgIDIn ) );
|
||
|
if ( S_OK == hr )
|
||
|
{
|
||
|
hrResult = S_OK;
|
||
|
}
|
||
|
|
||
|
psei->Release( );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// TODO: gpease 23-JAN-2001
|
||
|
// Add additional pages here.
|
||
|
//
|
||
|
|
||
|
HRETURN( hrResult );
|
||
|
}
|
||
|
|
||
|
|
||
|
// ************************************************************************
|
||
|
//
|
||
|
// IShellPropSheetExt
|
||
|
//
|
||
|
// ************************************************************************
|
||
|
|
||
|
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
STDMETHODIMP
|
||
|
CDocPropShExt::AddPages(
|
||
|
LPFNADDPROPSHEETPAGE lpfnAddPageIn
|
||
|
, LPARAM lParam
|
||
|
)
|
||
|
{
|
||
|
TraceFunc( "" );
|
||
|
|
||
|
HRESULT hr;
|
||
|
|
||
|
IShellPropSheetExt * pspse = NULL;
|
||
|
|
||
|
//
|
||
|
// Check state
|
||
|
//
|
||
|
|
||
|
if ( NULL == _punkSummary )
|
||
|
goto InvalidState;
|
||
|
|
||
|
//
|
||
|
// Add the Summary Page
|
||
|
//
|
||
|
|
||
|
hr = THR( _punkSummary->TYPESAFEQI( pspse ) );
|
||
|
if ( S_OK != hr )
|
||
|
goto Cleanup;
|
||
|
|
||
|
hr = THR( pspse->AddPages( lpfnAddPageIn, lParam ) );
|
||
|
if ( FAILED( hr ) )
|
||
|
goto Cleanup;
|
||
|
|
||
|
// release to reuse
|
||
|
pspse->Release( );
|
||
|
pspse = NULL;
|
||
|
|
||
|
//
|
||
|
// TODO: gpease 23-JAN-2001
|
||
|
// Add additional pages here.
|
||
|
//
|
||
|
|
||
|
Cleanup:
|
||
|
if ( NULL != pspse )
|
||
|
{
|
||
|
pspse->Release( );
|
||
|
}
|
||
|
|
||
|
HRETURN( hr );
|
||
|
|
||
|
InvalidState:
|
||
|
hr = THR( E_UNEXPECTED ); // REVIEW: gpease 23-JAN-2001 * Is there a better error code?
|
||
|
goto Cleanup;
|
||
|
}
|
||
|
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
STDMETHODIMP
|
||
|
CDocPropShExt::ReplacePage(
|
||
|
UINT uPageIDIn
|
||
|
, LPFNADDPROPSHEETPAGE lpfnReplacePageIn
|
||
|
, LPARAM lParam
|
||
|
)
|
||
|
{
|
||
|
TraceFunc( "" );
|
||
|
|
||
|
HRESULT hr = THR( E_NOTIMPL );
|
||
|
|
||
|
HRETURN( hr );
|
||
|
}
|
||
|
|
||
|
|
||
|
// ***************************************************************************
|
||
|
//
|
||
|
// Private methods
|
||
|
//
|
||
|
// ***************************************************************************
|
||
|
|
||
|
|