|
|
/*****************************************************************************
* * mappsx.c - IShellPropSheetExt interface * *****************************************************************************/
#include "map.h"
/*****************************************************************************
* * The sqiffle for this file. * *****************************************************************************/
#define sqfl sqflPsx
/*****************************************************************************
* * Declare the interfaces we will be providing. * * We must implement an IShellExtInit so the shell * will know that we are ready for action. * *****************************************************************************/
Primary_Interface(CMapPsx, IShellPropSheetExt); Secondary_Interface(CMapPsx, IShellExtInit);
/*****************************************************************************
* * CMapPsx * * The property sheet extension for the Map/Ctrl gizmo. * *****************************************************************************/
typedef struct CMapPsx {
/* Supported interfaces */ IShellPropSheetExt psx; IShellExtInit sxi;
} CMapPsx, CMSX, *PCMSX;
typedef IShellPropSheetExt PSX, *PPSX; typedef IShellExtInit SXI, *PSXI; typedef IDataObject DTO, *PDTO; /* Used by IShellExtInit */
/*****************************************************************************
* * CMapPsx_QueryInterface (from IUnknown) * * We need to check for our additional interfaces before falling * through to Common_QueryInterface. * *****************************************************************************/
STDMETHODIMP CMapPsx_QueryInterface(PPSX ppsx, RIID riid, PPV ppvObj) { PCMSX this = IToClass(CMapPsx, psx, ppsx); HRESULT hres; if (IsEqualIID(riid, &IID_IShellExtInit)) { *ppvObj = &this->sxi; Common_AddRef(this); hres = S_OK; } else { hres = Common_QueryInterface(this, riid, ppvObj); } AssertF(fLimpFF(FAILED(hres), *ppvObj == 0)); return hres; }
/*****************************************************************************
* * CMapPsx_AddRef (from IUnknown) * CMapPsx_Release (from IUnknown) * *****************************************************************************/
#ifdef DEBUG
Default_AddRef(CMapPsx) Default_Release(CMapPsx) #else
#define CMapPsx_AddRef Common_AddRef
#define CMapPsx_Release Common_Release
#endif
/*****************************************************************************
* * CMapPsx_Finalize (from Common) * * Release the resources of an CMapPsx. * *****************************************************************************/
void EXTERNAL CMapPsx_Finalize(PV pv) { PCMSX this = pv;
EnterProc(CMapPsx_Finalize, (_ "p", pv));
ExitProc(); }
/*****************************************************************************
* * CMapPsx_AddPages (From IShellPropSheetExt) * * Add one or more pages to an existing property sheet. * * lpfnAdd - callback function to add pages * lp - refdata for lpfnAdd * *****************************************************************************/
STDMETHODIMP CMapPsx_AddPages(PPSX ppsx, LPFNADDPROPSHEETPAGE lpfnAdd, LPARAM lp) { PCMSX this = IToClass(CMapPsx, psx, ppsx); HRESULT hres; EnterProc(CMapPsx_AddPages, (_ "p", ppsx));
/*
* Add the page only on Windows NT. */ if ((int)GetVersion() >= 0 && lpfnAdd) { HPROPSHEETPAGE hpsp; PROPSHEETPAGE psp; psp.dwSize = sizeof(psp); psp.dwFlags = PSP_DEFAULT; psp.hInstance = g_hinst; psp.pszTemplate = MAKEINTRESOURCE(IDD_MAIN); psp.pfnDlgProc = MapPs_DlgProc;
hpsp = CreatePropertySheetPage(&psp); if (hpsp) { if (lpfnAdd(hpsp, lp)) { Common_AddRef(this); hres = S_OK; } else { DestroyPropertySheetPage(hpsp); hres = E_FAIL; } } else { hres = E_FAIL; } } else { hres = E_INVALIDARG; }
ExitOleProc(); return hres; }
/*****************************************************************************
* * CMapPsx_ReplacePages (From IShellPropSheetExt) * * Replaces one or more pages in an existing property sheet. * * id - page identifier * lpfnReplace - callback function to replace the page * lp - refdata for lpfnReplace * *****************************************************************************/
STDMETHODIMP CMapPsx_ReplacePages(PPSX ppsx, UINT id, LPFNADDPROPSHEETPAGE lpfnAdd, LPARAM lp) { PCMSX this = IToClass(CMapPsx, psx, ppsx); HRESULT hres; EnterProc(CMapPsx_ReplacePages, (_ "pu", ppsx, id));
hres = S_OK;
ExitOleProc(); return hres; }
/*****************************************************************************
* * CMapPsx_SXI_Initialize (from IShellExtension) * *****************************************************************************/
STDMETHODIMP CMapPsx_SXI_Initialize(PSXI psxi, PCIDL pidlFolder, PDTO pdto, HKEY hk) { PCMSX this = IToClass(CMapPsx, sxi, psxi); HRESULT hres; EnterProc(CMapPsx_SXI_Initialize, (_ ""));
hres = S_OK;
ExitOleProc(); return hres; }
/*****************************************************************************
* * CMapPsx_New (from IClassFactory) * * Note that we release the pmpsx that Common_New created, because we * are done with it. The real refcount is handled by the * CMapPsx_QueryInterface. * *****************************************************************************/
STDMETHODIMP CMapPsx_New(RIID riid, PPV ppvObj) { HRESULT hres; EnterProc(CMapPsx_New, (_ "G", riid));
*ppvObj = 0; hres = Common_New(CMapPsx, ppvObj); if (SUCCEEDED(hres)) { PCMSX pmpsx = *ppvObj; pmpsx->sxi.lpVtbl = Secondary_Vtbl(CMapPsx, IShellExtInit); hres = CMapPsx_QueryInterface(&pmpsx->psx, riid, ppvObj); Common_Release(pmpsx); }
ExitOleProcPpv(ppvObj); return hres; }
/*****************************************************************************
* * The long-awaited vtbls * *****************************************************************************/
#pragma BEGIN_CONST_DATA
Primary_Interface_Begin(CMapPsx, IShellPropSheetExt) CMapPsx_AddPages, CMapPsx_ReplacePages, Primary_Interface_End(CMapPsx, IIShellPropSheetExt)
Secondary_Interface_Begin(CMapPsx, IShellExtInit, sxi) CMapPsx_SXI_Initialize, Secondary_Interface_End(CMapPsx, IShellExtInit, sxi)
|