|
|
/*--------------------------------------------------------------------------*
* * Microsoft Windows * Copyright (C) Microsoft Corporation, 1999 - 1999 * * File: fldrsnap.h * * Contents: Header file for built-in snapins that implement * the Folder, ActiveX Control, and Web Link nodes. * These replace earlier code that had special "built-in" * nodetypes. * * History: 23-Jul-98 vivekj Created * *--------------------------------------------------------------------------*/ #ifndef __FOLDERSNAPIN_H_
#define __FOLDERSNAPIN_H_
extern const CLSID CLSID_FolderSnapin; extern const CLSID CLSID_OCXSnapin; extern const CLSID CLSID_HTMLSnapin;
extern LPCTSTR szClsid_FolderSnapin; extern LPCTSTR szClsid_HTMLSnapin; extern LPCTSTR szClsid_OCXSnapin;
// forward decls
class CHTMLPage1; class CHTMLPage2;
class CActiveXPage0; class CActiveXPage1; class CActiveXPage2;
HRESULT WINAPI IPersistStreamFunc(void* pv, REFIID riid, LPVOID* ppv, DWORD dw);
SC ScFormatIndirectSnapInName ( HINSTANCE hInst, /* I:module containing the resource */ int idNameString, /* I:ID of name's string resource */ CStr& strName); /* O:formatted indirect name string */
/*+-------------------------------------------------------------------------*
* Class: CSnapinDescriptor * * PURPOSE: A class that contains information to be filled in by * derived snap-ins. * *+-------------------------------------------------------------------------*/ class CSnapinDescriptor { private: UINT m_idsName; UINT m_idsDescription; UINT m_idbSmallImage; UINT m_idbSmallImageOpen; UINT m_idbLargeImage; long m_viewOptions; // for GetResultViewType
UINT m_idiSnapinImage; // the icon used by ISnapinAbout
public: const CLSID & m_clsidSnapin; // the snapin class ID
const LPCTSTR m_szClsidSnapin; const GUID & m_guidNodetype; // root node type
const LPCTSTR m_szGuidNodetype;
const LPCTSTR m_szClassName; const LPCTSTR m_szProgID; const LPCTSTR m_szVersionIndependentProgID;
public: CSnapinDescriptor(); CSnapinDescriptor(UINT idsName, UINT idsDescription, UINT idiSnapinImage, UINT idbSmallImage, UINT idbSmallImageOpen, UINT idbLargeImage, const CLSID &clsidSnapin, LPCTSTR szClsidSnapin, const GUID &guidNodetype, LPCTSTR szGuidNodetype, LPCTSTR szClassName, LPCTSTR szProgID, LPCTSTR szVersionIndependentProgID, long viewOptions);
void GetName(CStr &str); void GetRegisteredDefaultName(CStr &str); void GetRegisteredIndirectName(CStr &str); UINT GetDescription() {return m_idsDescription;} HBITMAP GetSmallImage(); HBITMAP GetSmallImageOpen(); HBITMAP GetLargeImage(); long GetViewOptions(); HICON GetSnapinImage(); };
/*+-------------------------------------------------------------------------*
* class CSnapinComponentDataImpl * * * PURPOSE: Implements IComponentData for the built-in snapins. * *+-------------------------------------------------------------------------*/ class CSnapinComponentDataImpl : public IComponentData, public CComObjectRoot, public ISnapinAbout, public ISnapinHelp, public IPersistStream, public IExtendPropertySheet2, public CSerialObjectRW { friend class CSnapinComponentImpl; public:
CSnapinComponentDataImpl(); virtual CSnapinDescriptor& GetDescriptor() = 0;
// IComponentData
STDMETHODIMP Initialize(LPUNKNOWN pUnknown); STDMETHODIMP Notify(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param); STDMETHODIMP Destroy(); STDMETHODIMP QueryDataObject(MMC_COOKIE cookie, DATA_OBJECT_TYPES type, LPDATAOBJECT* ppDataObject); STDMETHODIMP GetDisplayInfo( SCOPEDATAITEM* pScopeDataItem); STDMETHODIMP CompareObjects(LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB);
// IPersistStream
STDMETHODIMP GetClassID(CLSID *pClassID); STDMETHODIMP IsDirty(void); STDMETHODIMP Load(LPSTREAM pStm); STDMETHODIMP Save(LPSTREAM pStm , BOOL fClearDirty); STDMETHODIMP GetSizeMax(ULARGE_INTEGER* pcbSize );
// ISnapinHelp
STDMETHODIMP GetHelpTopic (LPOLESTR* ppszCompiledHelpFile);
// IExtendPropertySheet2
STDMETHODIMP CreatePropertyPages(LPPROPERTYSHEETCALLBACK lpProvider, LONG_PTR handle, LPDATAOBJECT lpIDataObject) = 0; STDMETHODIMP GetWatermarks(LPDATAOBJECT lpIDataObject, HBITMAP * lphWatermark, HBITMAP * lphHeader, HPALETTE * lphPalette, BOOL* bStretch); STDMETHODIMP QueryPagesFor(LPDATAOBJECT lpDataObject);
// override
virtual UINT GetHeaderBitmap() {return 0;} virtual UINT GetWatermark() {return 0;}
// CSerialObject methods
virtual UINT GetVersion() {return 1;} virtual HRESULT ReadSerialObject (IStream &stm, UINT nVersion); virtual HRESULT WriteSerialObject(IStream &stm);
protected: HRESULT OnPreload(HSCOPEITEM scopeItem);
private: // attributes - not persisted
IConsole2Ptr m_spConsole2; IConsoleNameSpace2Ptr m_spConsoleNameSpace2; bool m_bDirty; protected: UINT m_iImage; UINT m_iOpenImage;
void SetDirty(BOOL bState = TRUE) { m_bDirty = bState; }
private: // attributes - persisted
CStringTableString m_strName; // the name of the root node, which is the only node created by the snapin
CStringTableString m_strView; // the view displayed by the node.
public: void SetName(LPCTSTR sz); LPCTSTR GetName() {return m_strName.data();} void SetView(LPCTSTR sz); LPCTSTR GetView() {return m_strView.data();} };
/*+-------------------------------------------------------------------------*
* class CSnapinComponentImpl * * * PURPOSE: Implements IComponent for the built-in snapins. * *+-------------------------------------------------------------------------*/ class CSnapinComponentImpl : public CComObjectRoot, public IComponent { public: BEGIN_COM_MAP(CSnapinComponentImpl) COM_INTERFACE_ENTRY(IComponent) END_COM_MAP()
void Init(IComponentData *pComponentData);
// IComponent
STDMETHODIMP Initialize(LPCONSOLE lpConsole); STDMETHODIMP Notify(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param); STDMETHODIMP Destroy(MMC_COOKIE cookie); STDMETHODIMP QueryDataObject(MMC_COOKIE cookie, DATA_OBJECT_TYPES type, LPDATAOBJECT* ppDataObject); STDMETHODIMP GetResultViewType(MMC_COOKIE cookie, LPOLESTR* ppViewType, long* pViewOptions); STDMETHODIMP GetDisplayInfo( RESULTDATAITEM* pResultDataItem); STDMETHODIMP CompareObjects(LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB);
protected: CSnapinComponentDataImpl * GetComponentData();
protected: virtual SC ScOnSelect(BOOL bScope, BOOL bSelect);
protected: // attributes - not persisted
IConsole2Ptr m_spConsole2; IComponentDataPtr m_spComponentData; };
/*+-------------------------------------------------------------------------*
* class CSnapinDataObject * * * PURPOSE: Implements IDataObject for the built-in snapins. * *+-------------------------------------------------------------------------*/ class CSnapinDataObject : public CComObjectRoot, public IDataObject { public: BEGIN_COM_MAP(CSnapinDataObject) COM_INTERFACE_ENTRY(IDataObject) END_COM_MAP()
CSnapinDataObject();
// IDataObject
STDMETHODIMP GetDataHere(FORMATETC *pformatetc, STGMEDIUM *pmedium); private: STDMETHODIMP GetData(LPFORMATETC lpFormatetcIn, LPSTGMEDIUM lpMedium){ return E_NOTIMPL; }; STDMETHODIMP EnumFormatEtc(DWORD dwDirection, LPENUMFORMATETC* ppEnumFormatEtc){ return E_NOTIMPL; }; STDMETHODIMP QueryGetData(LPFORMATETC lpFormatetc) { return E_NOTIMPL; }; STDMETHODIMP GetCanonicalFormatEtc(LPFORMATETC lpFormatetcIn, LPFORMATETC lpFormatetcOut){ return E_NOTIMPL; }; STDMETHODIMP SetData(LPFORMATETC lpFormatetc, LPSTGMEDIUM lpMedium, BOOL bRelease){ return E_NOTIMPL; }; STDMETHODIMP DAdvise(LPFORMATETC lpFormatetc, DWORD advf, LPADVISESINK pAdvSink, LPDWORD pdwConnection){ return E_NOTIMPL; }; STDMETHODIMP DUnadvise(DWORD dwConnection){ return E_NOTIMPL; }; STDMETHODIMP EnumDAdvise(LPENUMSTATDATA* ppEnumAdvise){ return E_NOTIMPL; };
HRESULT WriteString(IStream *pStream, LPCOLESTR sz);
public: void Initialize(IComponentData *pComponentData, DATA_OBJECT_TYPES type); DATA_OBJECT_TYPES GetType() const {return m_type;}
private: bool m_bInitialized; IComponentDataPtr m_spComponentData; // back pointer to the parent.
DATA_OBJECT_TYPES m_type;
// Clipboard formats that are required by the console
static void RegisterClipboardFormats(); static UINT s_cfNodeType; static UINT s_cfNodeTypeString; static UINT s_cfDisplayName; static UINT s_cfCoClass; static UINT s_cfSnapinPreloads;
};
SC ScLoadAndAllocateString(UINT ids, LPOLESTR *lpstrOut);
/*+-------------------------------------------------------------------------*
* class CSnapinWrapper * * * PURPOSE: A template class, used to instantiate the snapin. * *+-------------------------------------------------------------------------*/ template <class CSnapin, const CLSID *pCLSID_Snapin> class CSnapinWrapper : public CSnapin, public CComCoClass<CSnapin, pCLSID_Snapin> { typedef CSnapinWrapper<CSnapin, pCLSID_Snapin> ThisClass;
BEGIN_COM_MAP(ThisClass) COM_INTERFACE_ENTRY(IComponentData) COM_INTERFACE_ENTRY(ISnapinAbout) COM_INTERFACE_ENTRY(ISnapinHelp) COM_INTERFACE_ENTRY(IPersistStream) COM_INTERFACE_ENTRY(IExtendPropertySheet2) END_COM_MAP()
DECLARE_NOT_AGGREGATABLE(ThisClass)
// registry
static HRESULT WINAPI UpdateRegistry(BOOL bRegister) { USES_CONVERSION;
CStr strName; GetSnapinDescriptor().GetRegisteredDefaultName (strName);
CStr strIndirectName; GetSnapinDescriptor().GetRegisteredIndirectName (strIndirectName);
_ATL_REGMAP_ENTRY rgEntries[] = { { L"VSnapinClsid", T2COLE( GetSnapinDescriptor().m_szClsidSnapin)}, { L"VNodetype", T2COLE( GetSnapinDescriptor().m_szGuidNodetype)}, { L"VSnapinName", T2COLE((LPCTSTR) strName)}, { L"VSnapinNameIndirect", T2COLE((LPCTSTR) strIndirectName)}, { L"VClassName", T2COLE( GetSnapinDescriptor().m_szClassName)}, { L"VProgID", T2COLE( GetSnapinDescriptor().m_szProgID)}, { L"VVersionIndependentProgID", T2COLE( GetSnapinDescriptor().m_szVersionIndependentProgID)}, { L"VFileName", T2COLE( g_szMmcndmgrDll)}, {NULL, NULL} };
return _Module.UpdateRegistryFromResource(IDR_FOLDERSNAPIN, bRegister, rgEntries); }
STDMETHODIMP GetSnapinDescription(LPOLESTR* lpDescription) { DECLARE_SC(sc, TEXT("CSnapinWrapper::GetSnapinDescription")); sc = ScLoadAndAllocateString(GetSnapinDescriptor().GetDescription(), lpDescription); return sc.ToHr(); }
STDMETHODIMP GetProvider(LPOLESTR* lpDescription) { DECLARE_SC(sc, TEXT("CSnapinWrapper::GetProvider")); sc = ScLoadAndAllocateString(IDS_BUILTIN_SNAPIN_PROVIDER, lpDescription); return sc.ToHr(); }
STDMETHODIMP GetSnapinVersion(LPOLESTR* lpDescription) { return E_NOTIMPL; }
STDMETHODIMP GetSnapinImage(HICON* hAppIcon) { DECLARE_SC (sc, TEXT("CSnapinWrapper::GetSnapinImage"));
sc = ScCheckPointers(hAppIcon); if(sc) return sc.ToHr(); *hAppIcon = GetDescriptor().GetSnapinImage(); return sc.ToHr(); }
STDMETHODIMP GetStaticFolderImage(HBITMAP* hSmallImage, HBITMAP* hSmallImageOpen, HBITMAP* hLargeImage, COLORREF* cMask) { DECLARE_SC (sc, TEXT("CSnapinWrapper::GetStaticFolderImage"));
sc = ScCheckPointers(hSmallImage, hSmallImageOpen, hLargeImage, cMask); if(sc) return sc.ToHr();
*hSmallImage = GetDescriptor().GetSmallImage(); *hSmallImageOpen = GetDescriptor().GetSmallImageOpen(); *hLargeImage = GetDescriptor().GetLargeImage(); *cMask = RGB(255, 0, 255);
return sc.ToHr(); }
virtual CSnapinDescriptor& GetDescriptor() { return GetSnapinDescriptor(); }
CSnapinWrapper() { CStr strName; GetDescriptor().GetName(strName); SetName(strName); }
};
//____________________________________________________________________________
//
// Class: CFolderSnapinData
//
// PURPOSE:
//____________________________________________________________________________
//
class CFolderSnapinData : public CSnapinComponentDataImpl { typedef CSnapinComponentDataImpl BC; public:
CFolderSnapinData();
// IComponentData
STDMETHODIMP CreateComponent(LPCOMPONENT* ppComponent);
// IExtendPropertySheet2
STDMETHODIMP CreatePropertyPages(LPPROPERTYSHEETCALLBACK lpProvider, LONG_PTR handle, LPDATAOBJECT lpIDataObject);
void SetDirty(BOOL bState = TRUE) { BC::SetDirty(bState); }
static CSnapinDescriptor& GetSnapinDescriptor(); };
typedef CSnapinWrapper<CFolderSnapinData, &CLSID_FolderSnapin> CFolderSnapin;
//____________________________________________________________________________
//
// Class: CFolderSnapinComponent
//
// PURPOSE:
//____________________________________________________________________________
//
class CFolderSnapinComponent : public CSnapinComponentImpl { };
//____________________________________________________________________________
//
// Class: CHTMLSnapinData
//
// PURPOSE:
//____________________________________________________________________________
//
class CHTMLSnapinData : public CSnapinComponentDataImpl { typedef CSnapinComponentDataImpl BC; public:
CHTMLSnapinData(); ~CHTMLSnapinData();
// IComponentData
STDMETHODIMP CreateComponent(LPCOMPONENT* ppComponent); STDMETHODIMP Destroy();
// IExtendPropertySheet2
STDMETHODIMP CreatePropertyPages(LPPROPERTYSHEETCALLBACK lpProvider, LONG_PTR handle, LPDATAOBJECT lpIDataObject);
virtual UINT GetWatermark() {return IDB_SETUPWIZARD1;}
static CSnapinDescriptor& GetSnapinDescriptor();
private: CHTMLPage1 *m_pHtmlPage1; CHTMLPage2 *m_pHtmlPage2; };
typedef CSnapinWrapper<CHTMLSnapinData, &CLSID_HTMLSnapin> CHTMLSnapin;
//____________________________________________________________________________
//
// Class: CHTMLSnapinComponent
//
// PURPOSE:
//____________________________________________________________________________
//
class CHTMLSnapinComponent : public CSnapinComponentImpl { typedef CSnapinComponentImpl BC; public: virtual SC ScOnSelect(BOOL bScope, BOOL bSelect);
STDMETHODIMP GetResultViewType(MMC_COOKIE cookie, LPOLESTR* ppViewType, long* pViewOptions);
};
//____________________________________________________________________________
//
// Class: COCXSnapinData
//
// PURPOSE:
//____________________________________________________________________________
//
class COCXSnapinData : public CSnapinComponentDataImpl { typedef CSnapinComponentDataImpl BC; public:
COCXSnapinData(); ~COCXSnapinData();
// IComponentData
STDMETHODIMP CreateComponent(LPCOMPONENT* ppComponent); STDMETHODIMP Destroy();
// IExtendPropertySheet2
STDMETHODIMP CreatePropertyPages(LPPROPERTYSHEETCALLBACK lpProvider, LONG_PTR handle, LPDATAOBJECT lpIDataObject);
virtual UINT GetHeaderBitmap() {return IDB_OCX_WIZARD_HEADER;} virtual UINT GetWatermark() {return IDB_SETUPWIZARD;}
static CSnapinDescriptor& GetSnapinDescriptor();
private: CActiveXPage0* m_pActiveXPage0; CActiveXPage1* m_pActiveXPage1; CActiveXPage2* m_pActiveXPage2;
};
typedef CSnapinWrapper<COCXSnapinData, &CLSID_OCXSnapin> COCXSnapin;
//____________________________________________________________________________
//
// Class: COCXSnapinComponent
//
// PURPOSE:
//____________________________________________________________________________
//
class COCXSnapinComponent : public CSnapinComponentImpl, IPersistStorage { public: COCXSnapinComponent() : m_bLoaded(FALSE), m_bInitialized(FALSE) {}
BEGIN_COM_MAP(COCXSnapinComponent) COM_INTERFACE_ENTRY(IPersistStorage) COM_INTERFACE_ENTRY_CHAIN(CSnapinComponentImpl) END_COM_MAP()
// IPersistStorage
STDMETHODIMP HandsOffStorage(); STDMETHODIMP InitNew(IStorage* pStg); STDMETHODIMP IsDirty(); STDMETHODIMP Load(IStorage* pStg); STDMETHODIMP Save(IStorage* pStg, BOOL fSameAsLoad); STDMETHODIMP SaveCompleted(IStorage* pStgNew); STDMETHODIMP GetClassID(CLSID *pClassID);
// IComponenent override
STDMETHODIMP Notify(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param);
protected: STDMETHODIMP OnInitOCX(LPDATAOBJECT lpDataObject, LPARAM arg, LPARAM param);
private: IStoragePtr m_spStg; // Storage provided by MMC
IStoragePtr m_spStgInner; // Nested storage given to OCX
IPersistStreamPtr m_spIPStm; // Persist interfaces from OCX
IPersistStoragePtr m_spIPStg; // only one will be used
BOOL m_bLoaded; // MMC called Load
BOOL m_bInitialized; // MMC called InitNew
};
#endif
|