// This is a part of the Microsoft Management Console. // Copyright 1995 - 1997 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Microsoft Management Console and related // electronic documentation provided with the interfaces. // stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, // but are changed infrequently #undef _MSC_EXTENSIONS // define this symbol to insert another level of User,Company,Virtual // nodes whenever one of the nodes is expanded // #define RECURSIVE_NODE_EXPANSION #include #include // MFC extensions #include #include "afxtempl.h" //#include #include using namespace ATL; //You may derive a class from CComModule and use it if you want to override //something, but do not change the name of _Module extern CComModule _Module; #include //#include "afxtempl.h" #pragma comment(lib, "mmc") #include const long UNINITIALIZED = -1; // Constants used in samples const int NUM_FOLDERS = 4; const int NUM_NAMES = 4; const int NUM_COMPANY = 6; const int NUM_VIRTUAL_ITEMS = 100000; const int MAX_ITEM_NAME = 64; // Sample folder types enum FOLDER_TYPES { STATIC = 0x8000, COMPANY = 0x8001, USER = 0x8002, VIRTUAL = 0x8003, EXT_COMPANY = 0x8004, EXT_USER = 0x8005, EXT_VIRTUAL = 0x8006, NONE = 0xFFFF }; ///////////////////////////////////////////////////////////////////////////// // Helper functions template inline void SAFE_RELEASE(TYPE*& pObj) { if (pObj != NULL) { pObj->Release(); pObj = NULL; } else { TRACE(_T("Release called on NULL interface ptr\n")); } } extern const CLSID CLSID_Snapin; // In-Proc server GUID extern const CLSID CLSID_Extension; // In-Proc server GUID extern const CLSID CLSID_About; /////////////////////////////////////////////////////////////////////////////// // // OBJECT TYPES // // // OBJECT TYPE for Scope Nodes. // // Static NodeType GUID in numeric & string formats. extern const GUID cNodeTypeStatic; extern const wchar_t* cszNodeTypeStatic; // Company Data NodeType GUID in numeric & string formats. extern const GUID cNodeTypeCompany; extern const wchar_t* cszNodeTypeCompany; // User Data NodeType GUID in numeric & string formats. extern const GUID cNodeTypeUser; extern const wchar_t* cszNodeTypeUser; // Extension Company Data NodeType GUID in numeric & string formats. extern const GUID cNodeTypeExtCompany; extern const wchar_t* cszNodeTypeExtCompany; // Extension User Data NodeType GUID in numeric & string formats. extern const GUID cNodeTypeExtUser; extern const wchar_t* cszNodeTypeExtUser; // Extension Virtual NodeType GUID in numeric & string formats. extern const GUID cNodeTypeVirtual; extern const wchar_t* cszNodeTypeVirtual; // Dynamicaly created objects. extern const GUID cNodeTypeDynamic; extern const wchar_t* cszNodeTypeDynamic; // // OBJECT TYPE for result items. // // Result items object type GUID in numeric & string formats. extern const GUID cObjectTypeResultItem; extern const wchar_t* cszObjectTypeResultItem; // // ////////////////////////////////////////////////////////////////////////////// // New Clipboard format that has the Type and Cookie extern const wchar_t* SNAPIN_INTERNAL; // Published context information for extensions to extend extern const wchar_t* SNAPIN_WORKSTATION; struct INTERNAL { INTERNAL() { m_type = CCT_UNINITIALIZED; m_cookie = -1; ZeroMemory(&m_clsid, sizeof(CLSID)); }; ~INTERNAL() {} DATA_OBJECT_TYPES m_type; // What context is the data object. MMC_COOKIE m_cookie; // What object the cookie represents CString m_string; // CLSID m_clsid; // Class ID of who created this data object INTERNAL & operator=(const INTERNAL& rhs) { if (&rhs == this) return *this; // Deep copy the information m_type = rhs.m_type; m_cookie = rhs.m_cookie; m_string = rhs.m_string; memcpy(&m_clsid, &rhs.m_clsid, sizeof(CLSID)); return *this; } BOOL operator==(const INTERNAL& rhs) { return rhs.m_string == m_string; } }; // Debug instance counter #ifdef _DEBUG inline void DbgInstanceRemaining(char * pszClassName, int cInstRem) { char buf[100]; wsprintfA(buf, "%s has %d instances left over.", pszClassName, cInstRem); ::MessageBoxA(NULL, buf, "SAMPLE: Memory Leak!!!", MB_OK); } #define DEBUG_DECLARE_INSTANCE_COUNTER(cls) extern int s_cInst_##cls = 0; #define DEBUG_INCREMENT_INSTANCE_COUNTER(cls) ++(s_cInst_##cls); #define DEBUG_DECREMENT_INSTANCE_COUNTER(cls) --(s_cInst_##cls); #define DEBUG_VERIFY_INSTANCE_COUNT(cls) \ extern int s_cInst_##cls; \ if (s_cInst_##cls) DbgInstanceRemaining(#cls, s_cInst_##cls); #else #define DEBUG_DECLARE_INSTANCE_COUNTER(cls) #define DEBUG_INCREMENT_INSTANCE_COUNTER(cls) #define DEBUG_DECREMENT_INSTANCE_COUNTER(cls) #define DEBUG_VERIFY_INSTANCE_COUNT(cls) #endif