//____________________________________________________________________________ // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1997 - 1999 // // File: regutil.h // // Contents: // // Classes: // // Functions: // // History: 3/20/1997 RaviR Created //____________________________________________________________________________ // #pragma once #include "nmtempl.h" #ifdef COMMENTS_ONLY /* REGISTRY LAYOUT USED BY MMC: SNAPINS HKEY_LOCAL_MACHINE\Software\Microsoft\MMC\SnapIns {04ebc1e6-a16c-11d0-a799-00c04fd8d565} // See N-1. NameString = REG_SZ "Snapin Name" About = REG_SZ "{128ac4e6-a16c-11d0-a799-00c04fd8d565}" // See N-2. NodeTypes // See N-3. {c713e06c-a16e-11d0-a799-00c04fd8d565} {c713e06d-a16e-11d0-a799-00c04fd8d565} {c713e06e-a16e-11d0-a799-00c04fd8d565} {c713e06f-a16e-11d0-a799-00c04fd8d565} StandAlone // See N-4. RequiredExtensions // See N-5. {a2087336-a16c-11d0-a799-00c04fd8d565} {70098cd3-a16c-11d0-a799-00c04fd8d565} N-1) Snapin clsid. Only snapins that add to the name space should be entered here. N-2) Clisd of the object that will be cocreated to get the IAbout interface ptr for the snapin. N-3) Enumerate all the node type GUIDs that may be put up by this snapin. N-4) [Optional] Add the 'StandAlone' key only if the snapin can appear by itself under the Console Root. If this key is not present the snapin is assumed to be name space extension snapin. Note: A stand alone snapin can also be an extension snapin (i.e. it can extend some other snapin). N-5) [Optional] Enumerate the CLSIDs of extension snapins that are required for this snapin to function. NODETYPES HKEY_LOCAL_MACHINE\Software\Microsoft\MMC\NodeTypes {12345601-EA27-11CF-ADCF-00AA00A80033} // Node type GUID = REG_SZ "Log object" Extensions NameSpace // See N-7. {19876201-EA27-11CF-ADCF-00AA00A80033} = REG_SZ "Alert SnapIn" {34346202-EA27-11CF-ADCF-00AA00A80033} = REG_SZ "Viewer SnapIn" ContextMenu // See N-8. {19876202-EA27-11CF-ADCF-00AA00A80033} = REG_SZ "Alert SnapIn" {34346202-EA27-11CF-ADCF-00AA00A80033} = REG_SZ "Viewer SnapIn" ToolBar // See N-9. {19876202-EA27-11CF-ADCF-00AA00A80033} = REG_SZ "Alert SnapIn" {00234ca8-EA27-11CF-ADCF-00AA00A80033} = REG_SZ "Pure toolbar extn obj" PropertySheet // See N-10. {12222222-EA27-11CF-ADCF-00AA00A80033} = REG_SZ "Pure propery sheet extn obj" View // See N-12. {12222222-EA27-11CF-ADCF-00AA00A80033} = REG_SZ "View extn obj" Task // See N-13. {12222222-EA27-11CF-ADCF-00AA00A80033} = REG_SZ "Snapin Taskpad extn obj" Taskpad // See N-14. {12222222-EA27-11CF-ADCF-00AA00A80033} = REG_SZ "MMC2.0 Taskpad extn obj" Dynamic Extensions // See N-11 {34346202-EA27-11CF-ADCF-00AA00A80033} = REG_SZ "Viewer SnapIn" N-7) Under the key 'NameSpace' list the CLSIDs of snapins that can extend the name space of this nodetype. N-8) Under the 'ContextMenu' key list the CLSIDs of snapins that can extend the context menu of items put up by this nodetype. N-9) Under the 'ToolBar' key list the CLSIDs of snapins that can extend the toolbar of items put up by this nodetype. N-10)Under the 'PropertySheet' key list the CLSIDs of snapins that can extend the property sheet of items put up by this nodetype. N-11)Under the 'Dynamic Extensions' Key list the CLSIDs of extensions that can only be enabled dynamically, not by the snap-in manager. Any CLSIDs listed here should also appear under one on the other extension sub-keys. N-12)Under the 'View' key list the CLSIDs of snapins that can extend the view of items put up by this nodetype. N-13)Under the 'Task' key list the CLSIDs of snapins that can extend the Taskpad of items put up by this nodetype. */ #endif // COMMENTS_ONLY #ifndef _REGUTIL_H_ #define _REGUTIL_H_ #ifdef DBG #define ASSERT_INITIALIZED ASSERT(dbg_m_fInit == TRUE) #else #define ASSERT_INITIALIZED #endif // Forward decl class CPolicy; /*+-------------------------------------------------------------------------* * class CExtensionsIterator * * * PURPOSE: Allows iterating through all the extension snap-ins for a particular * nodetype. * Once initialized, returns, in order, all the registered extensions * followed by all the dynamic extensions. If a dynamic extension was * also a static extension, does not repeat the snap-in. * * * USAGE: Initialize the object, then make calls to GetCLSID() followed by * Advance() until IsEnd() returns true. * *+-------------------------------------------------------------------------*/ class CExtensionsIterator { public: // Constructor & destructor CExtensionsIterator(); ~CExtensionsIterator(); // 1st variation - initializes the iterator from a dataobject and an extension type SC ScInitialize(LPDATAOBJECT pDataObject, LPCTSTR pszExtensionTypeKey); // 2nd variation (legacy) SC ScInitialize(CSnapIn *pSnapIn, GUID& rGuidNodeType, LPCTSTR pszExtensionTypeKey, LPCLSID pDynExtCLSID = NULL, int cDynExt = 0); // Attributes BOOL IsEnd() { ASSERT_INITIALIZED; return (m_pExtSI == NULL && m_nDynIndex >= m_cDynExt); } BOOL IsDynamic() { ASSERT_INITIALIZED; return (m_pExtSI == NULL); } void Reset() { ASSERT_INITIALIZED; m_pExtSI = m_spSnapIn->GetExtensionSnapIn(); m_nDynIndex = 0; m_cExtUsed = 0; _EnsureExtension(); } void Advance() { ASSERT_INITIALIZED; if (m_pExtSI != NULL) m_pExtSI = m_pExtSI->Next(); else m_nDynIndex++; _EnsureExtension(); } const CLSID& GetCLSID() { ASSERT_INITIALIZED; if (m_pExtSI != NULL) return m_pExtSI->GetCLSID(); else if (m_nDynIndex < m_cDynExt) return m_pDynExtCLSID[m_nDynIndex]; ASSERT(FALSE); return GUID_NULL; } CSnapIn* GetSnapIn() { ASSERT_INITIALIZED; if (m_pExtSI != NULL) { return m_pExtSI->GetSnapIn(); } ASSERT(FALSE); return NULL; } private: HRESULT Init(GUID& rGuidNodeType, LPCTSTR pszExtensionTypeKey); // Implementation private: CSnapInPtr m_spSnapIn; CRegKeyEx m_rkey; CRegKeyEx m_rkeyDynExt; CExtSI* m_pExtSI; CExtSI** m_ppExtUsed; CArray m_cachedDynExtens; LPCLSID m_pDynExtCLSID; int m_cDynExt; int m_nDynIndex; int m_cExtUsed; CPolicy* m_pMMCPolicy; #ifdef DBG BOOL dbg_m_fInit; #endif void _EnsureExtension() { ASSERT_INITIALIZED; // Step through the snap-in's static extensions first for (; m_pExtSI != NULL; m_pExtSI = m_pExtSI->Next()) { if (m_pExtSI->IsNew() == TRUE) continue; // Is this registered as the correct extension type? // Note: if extension is required, then it doesn't // have to be registered as a static extension if (_Extends(!m_pExtSI->IsRequired()) == TRUE) { m_ppExtUsed[m_cExtUsed++] = m_pExtSI; return; } } // When they are exhausted, go through the dynamic list for (; m_nDynIndex < m_cDynExt; m_nDynIndex++) { if (_Extends() == FALSE) continue; // Don't use dynamic extension that is already used statically for (int i=0; i< m_cExtUsed; i++) { if (IsEqualCLSID(m_pDynExtCLSID[m_nDynIndex], m_ppExtUsed[i]->GetCLSID())) break; } if (i == m_cExtUsed) return; } } BOOL _Extends(BOOL bStatically = FALSE); // Undefined CExtensionsIterator(const CExtensionsIterator& rhs); CExtensionsIterator& operator= (const CExtensionsIterator& rhs); }; // class CExtensionsIterator template<> inline UINT HashKey(GUID& guid) { unsigned short* Values = (unsigned short *)&guid; return (Values[0] ^ Values[1] ^ Values[2] ^ Values[3] ^ Values[4] ^ Values[5] ^ Values[6] ^ Values[7]); } class CExtensionsCache : public CMap { public: CExtensionsCache() { InitHashTable(31); } void Add(GUID& guid) { SetAt(guid, 0); } }; // class CExtensionsCache typedef XMapIterator CExtensionsCacheIterator; HRESULT ExtractDynExtensions(IDataObject* pdataObj, CArray& arrayGuid); SC ScGetExtensionsForNodeType(GUID& guid, CExtensionsCache& extnsCache); HRESULT MMCGetExtensionsForSnapIn(const CLSID& clsid, CExtensionsCache& extnsCache); BOOL ExtendsNodeNameSpace(GUID& rguidNodeType, CLSID* pclsidExtn); bool GetSnapinNameFromCLSID(const CLSID& clsid, tstring& tszSnapinName); SC ScGetAboutFromSnapinCLSID(LPCTSTR szClsidSnapin, CLSID& clsidAbout); SC ScGetAboutFromSnapinCLSID(const CLSID& clsidSnapin, CLSID& clsidAbout); bool IsIndirectStringSpecifier (LPCTSTR psz); template SC ScGetSnapinNameFromRegistry (const CLSID& clsid, StringType& str); template SC ScGetSnapinNameFromRegistry (LPCTSTR pszClsid, StringType& str); template SC ScGetSnapinNameFromRegistry (CRegKeyEx& key, StringType& str); inline BOOL HasNameSpaceExtensions(GUID& rguidNodeType) { return ExtendsNodeNameSpace(rguidNodeType, NULL); } #include "regutil.inl" #endif // _REGUTIL_H_