WindowsXP-SP1/shell/ext/docpropv3/shutils.cpp
2020-09-30 16:53:49 +02:00

197 lines
4.7 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 "shutils.h"
#pragma hdrstop
//
// Borrowed so we can link to STOCK.LIB
//
#define SZ_DEBUGINI "ccshell.ini"
#define SZ_DEBUGSECTION "DOCPROP3"
#define SZ_MODULE "DOCPROP3"
#ifdef DEBUG
#define DECLARE_DEBUG
#endif
#ifdef DECLARE_DEBUG
// (These are deliberately CHAR)
EXTERN_C const CHAR c_szCcshellIniFile[] = SZ_DEBUGINI;
EXTERN_C const CHAR c_szCcshellIniSecDebug[] = SZ_DEBUGSECTION;
EXTERN_C const WCHAR c_wszTrace[] = L"t " TEXTW(SZ_MODULE) L" ";
EXTERN_C const WCHAR c_wszErrorDbg[] = L"err " TEXTW(SZ_MODULE) L" ";
EXTERN_C const WCHAR c_wszWarningDbg[] = L"wn " TEXTW(SZ_MODULE) L" ";
EXTERN_C const WCHAR c_wszAssertMsg[] = TEXTW(SZ_MODULE) L" Assert: ";
EXTERN_C const WCHAR c_wszAssertFailed[] = TEXTW(SZ_MODULE) L" Assert %ls, line %d: (%ls)\r\n";
EXTERN_C const WCHAR c_wszRip[] = TEXTW(SZ_MODULE) L" RIP in %s at %s, line %d: (%s)\r\n";
EXTERN_C const WCHAR c_wszRipNoFn[] = TEXTW(SZ_MODULE) L" RIP at %s, line %d: (%s)\r\n";
// (These are deliberately CHAR)
EXTERN_C const CHAR c_szTrace[] = "t " SZ_MODULE " ";
EXTERN_C const CHAR c_szErrorDbg[] = "err " SZ_MODULE " ";
EXTERN_C const CHAR c_szWarningDbg[] = "wn " SZ_MODULE " ";
EXTERN_C const CHAR c_szAssertMsg[] = SZ_MODULE " Assert: ";
EXTERN_C const CHAR c_szAssertFailed[] = SZ_MODULE " Assert %s, line %d: (%s)\r\n";
EXTERN_C const CHAR c_szRip[] = SZ_MODULE " RIP in %s at %s, line %d: (%s)\r\n";
EXTERN_C const CHAR c_szRipNoFn[] = SZ_MODULE " RIP at %s, line %d: (%s)\r\n";
EXTERN_C const CHAR c_szRipMsg[] = SZ_MODULE " RIP: ";
#endif // DECLARE_DEBUG && DEBUG
#if defined(DECLARE_DEBUG) && defined(PRODUCT_PROF)
EXTERN_C const CHAR c_szCcshellIniFile[] = SZ_DEBUGINI;
EXTERN_C const CHAR c_szCcshellIniSecDebug[] = SZ_DEBUGSECTION;
#endif
//
// Use TraceFree( ) to free the handle returned here
//
// Return Values:
// S_OK
// Successfully extracted and copied the HIDA.
//
// E_OUTOFMEMORY
// Failed to copy the HIDA.
//
// other HRESULTs
//
HRESULT
DataObj_CopyHIDA(
IDataObject * pdtobjIn
, CIDA ** ppidaOut
)
{
TraceFunc( "" );
HRESULT hr;
STGMEDIUM medium;
static CLIPFORMAT g_cfHIDA = 0;
FORMATETC fmte = { 0, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL };
// Check parameters
Assert( NULL != pdtobjIn );
Assert( NULL != ppidaOut );
// Clear out parameter
*ppidaOut = NULL;
//
// Register clip format if not already done.
//
if ( 0 == g_cfHIDA )
{
g_cfHIDA = (CLIPFORMAT) RegisterClipboardFormat( CFSTR_SHELLIDLIST );
}
fmte.cfFormat = g_cfHIDA;
//
// Retrieve HIDA
//
hr = THR( pdtobjIn->GetData( &fmte, &medium ) );
if ( SUCCEEDED( hr ) )
{
SIZE_T sizet = GlobalSize( medium.hGlobal );
if ( (~((DWORD) 0)) > sizet )
{
DWORD cb = (DWORD) sizet;
CIDA * pida = (CIDA *) TraceAlloc( 0, cb );
if ( NULL != pida )
{
void * pv = GlobalLock( medium.hGlobal );
CopyMemory( pida, pv, cb );
GlobalUnlock( medium.hGlobal );
*ppidaOut = pida;
}
else
{
hr = E_OUTOFMEMORY;
}
}
else
{
hr = E_OUTOFMEMORY;
}
ReleaseStgMedium( &medium );
}
HRETURN( hr );
}
//
//
//
HRESULT
BindToObjectWithMode(
LPCITEMIDLIST pidlIn
, DWORD grfModeIn
, REFIID riidIn
, void ** ppvIn
)
{
TraceFunc( "" );
HRESULT hr;
IBindCtx *pbc;
// Check parameters
Assert( NULL != pidlIn );
Assert( NULL != ppvIn );
*ppvIn = 0;
hr = THR( BindCtx_CreateWithMode( grfModeIn, &pbc ) );
if ( SUCCEEDED( hr ) )
{
hr = THR( SHBindToObjectEx( NULL, pidlIn, pbc, riidIn, ppvIn ) );
pbc->Release();
}
HRETURN( hr );
}
//
//
//
STDAPI_(LPITEMIDLIST)
IDA_FullIDList(
CIDA * pidaIn
, UINT idxIn
)
{
TraceFunc( "" );
LPITEMIDLIST pidl = NULL;
LPCITEMIDLIST pidlParent = IDA_GetIDListPtr( pidaIn, (UINT) -1 );
if ( NULL != pidlParent )
{
LPCITEMIDLIST pidlRel = IDA_GetIDListPtr( pidaIn, idxIn );
if ( NULL != pidlRel )
{
pidl = ILCombine( pidlParent, pidlRel );
}
}
RETURN( pidl );
}