windows-nt/Source/XPSP1/NT/admin/activec/samples/sdksamples/ppgeext/ppgeext.cpp
2020-09-26 16:20:57 +08:00

165 lines
5 KiB
C++

//==============================================================;
//
// This source code is only intended as a supplement to existing Microsoft documentation.
//
//
//
//
// THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
// KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
// PURPOSE.
//
// Copyright (C) 1999 Microsoft Corporation. All Rights Reserved.
//
//
//
//==============================================================;
#include "PPgeExt.h"
#include "resource.h"
#include "globals.h"
#include <crtdbg.h>
// we need to do this to get around MMC.IDL - it explicitly defines
// the clipboard formats as WCHAR types...
#define _T_CCF_DISPLAY_NAME _T("CCF_DISPLAY_NAME")
#define _T_CCF_NODETYPE _T("CCF_NODETYPE")
#define _T_CCF_SNAPIN_CLASSID _T("CCF_SNAPIN_CLASSID")
// These are the clipboard formats that we must supply at a minimum.
// mmc.h actually defined these. We can make up our own to use for
// other reasons. We don't need any others at this time.
UINT CPropSheetExtension::s_cfDisplayName = RegisterClipboardFormat(_T_CCF_DISPLAY_NAME);
UINT CPropSheetExtension::s_cfNodeType = RegisterClipboardFormat(_T_CCF_NODETYPE);
UINT CPropSheetExtension::s_cfSnapInCLSID = RegisterClipboardFormat(_T_CCF_SNAPIN_CLASSID);
CPropSheetExtension::CPropSheetExtension() : m_cref(0)
{
OBJECT_CREATED
}
CPropSheetExtension::~CPropSheetExtension()
{
OBJECT_DESTROYED
}
///////////////////////
// IUnknown implementation
///////////////////////
STDMETHODIMP CPropSheetExtension::QueryInterface(REFIID riid, LPVOID *ppv)
{
if (!ppv)
return E_FAIL;
*ppv = NULL;
if (IsEqualIID(riid, IID_IUnknown))
*ppv = static_cast<IExtendPropertySheet *>(this);
else if (IsEqualIID(riid, IID_IExtendPropertySheet))
*ppv = static_cast<IExtendPropertySheet *>(this);
if (*ppv)
{
reinterpret_cast<IUnknown *>(*ppv)->AddRef();
return S_OK;
}
return E_NOINTERFACE;
}
STDMETHODIMP_(ULONG) CPropSheetExtension::AddRef()
{
return InterlockedIncrement((LONG *)&m_cref);
}
STDMETHODIMP_(ULONG) CPropSheetExtension::Release()
{
if (InterlockedDecrement((LONG *)&m_cref) == 0)
{
// we need to decrement our object count in the DLL
delete this;
return 0;
}
return m_cref;
}
BOOL CALLBACK CPropSheetExtension::DialogProc(
HWND hwndDlg, // handle to dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
static CPropSheetExtension *pThis = NULL;
switch (uMsg) {
case WM_INITDIALOG:
pThis = reinterpret_cast<CPropSheetExtension *>(reinterpret_cast<PROPSHEETPAGE *>(lParam)->lParam);
break;
case WM_COMMAND:
if (HIWORD(wParam) == EN_CHANGE ||
HIWORD(wParam) == CBN_SELCHANGE)
SendMessage(GetParent(hwndDlg), PSM_CHANGED, (WPARAM)hwndDlg, 0);
break;
case WM_DESTROY:
// we don't free the notify handle for property sheets
// MMCFreeNotifyHandle(pThis->m_ppHandle);
break;
case WM_NOTIFY:
switch (((NMHDR *) lParam)->code) {
case PSN_APPLY:
// don't notify the primary snap-in that Apply
// has been hit...
// MMCPropertyChangeNotify(pThis->m_ppHandle, (long)pThis);
return PSNRET_NOERROR;
}
break;
}
return DefWindowProc(hwndDlg, uMsg, wParam, lParam);
}
///////////////////////////////
// Interface IExtendPropertySheet
///////////////////////////////
HRESULT CPropSheetExtension::CreatePropertyPages(
/* [in] */ LPPROPERTYSHEETCALLBACK lpProvider,
/* [in] */ LONG_PTR handle,
/* [in] */ LPDATAOBJECT lpIDataObject)
{
PROPSHEETPAGE psp;
HPROPSHEETPAGE hPage = NULL;
// we don't cache this handle like in a primary snap-in
// the handle value here is always 0
// m_ppHandle = handle;
psp.dwSize = sizeof(PROPSHEETPAGE);
psp.dwFlags = PSP_DEFAULT | PSP_USETITLE | PSP_USEICONID;
psp.hInstance = g_hinst;
psp.pszTemplate = MAKEINTRESOURCE(IDD_PROPPAGE_LARGE);
psp.pfnDlgProc = DialogProc;
psp.lParam = reinterpret_cast<LPARAM>(this);
psp.pszTitle = MAKEINTRESOURCE(IDS_PST_ROCKET_EXT);
psp.pszIcon = MAKEINTRESOURCE(IDI_PSI_ROCKET);
hPage = CreatePropertySheetPage(&psp);
_ASSERT(hPage);
HRESULT hr = lpProvider->AddPage(hPage);
return hr;
}
HRESULT CPropSheetExtension::QueryPagesFor(
/* [in] */ LPDATAOBJECT lpDataObject)
{
return S_OK;
}