#ifndef HOTFIX_MANAGER #define HOTFIX_MANAGER #include "resource.h" #include static _TCHAR gszComputerName[255]; static BOOL ComputerNameSent = FALSE; static IDispatch* gszManagerCtlDispatch = NULL; inline LPOLESTR CoTaskDupString( LPOLESTR pszInput ) { USES_CONVERSION; LPOLESTR pszOut = NULL; // // We throw an exception if the following allocation fails. // pszOut = (LPOLESTR) CoTaskMemAlloc( ( wcslen( pszInput ) + 1 ) * sizeof( OLECHAR ) ); if ( pszOut == NULL ) throw; wcscpy( pszOut, pszInput ); return( pszOut ); }; template class ATL_NO_VTABLE ISnapinHelpImpl : public ISnapinHelp { public: // get the dkms help file location and returns it STDMETHOD( GetHelpTopic )( LPOLESTR* lpCompiledHelpFile ) { _ASSERT( lpCompiledHelpFile != NULL ); USES_CONVERSION; HRESULT hr = E_FAIL; TCHAR szPath[ _MAX_PATH * 2 ]; // this is where the dkms help file is stored wcscpy(szPath,L"C:\\mmc-samples\\Hotfix_Snapin\\snapsamp.chm"); // MessageBox(NULL,szPath,_T("Help File Path"),MB_OK); // expand out the %systemroot% variable // ExpandEnvVars(szPath); // MessageBox(NULL,szPath,_T("Help File Path"),MB_OK); // Allocate the string and return it. *lpCompiledHelpFile = CoTaskDupString( T2W( szPath ) ); hr = S_OK; return( hr ); } }; class CHotfix_ManagerComponent; class CHotfix_ManagerData : public CSnapInItemImpl { public: static const GUID* m_NODETYPE; static const OLECHAR* m_SZNODETYPE; static const OLECHAR* m_SZDISPLAY_NAME; static const CLSID* m_SNAPIN_CLASSID; _TCHAR m_szComputerName[255]; _TCHAR m_szCreation[255]; bool m_bChild; bool b_Expanded; DWORD m_dwCurrentView; _TCHAR m_ProductName[255]; CHotfix_ManagerComponent* m_pComponent; static BSTR m_bstrColumnType; static BSTR m_bstrColumnDesc; CComPtr m_spControlBar; BEGIN_SNAPINCOMMAND_MAP(CHotfix_ManagerData, FALSE) END_SNAPINCOMMAND_MAP() // SNAPINMENUID(IDR_HOTFIXMANAGER_MENU) BEGIN_SNAPINTOOLBARID_MAP(CHotfix_ManagerData) // Create toolbar resources with button dimensions 16x16 // and add an entry to the MAP. You can add multiple toolbars // SNAPINTOOLBARID_ENTRY(Toolbar ID) END_SNAPINTOOLBARID_MAP() CHotfix_ManagerData(_TCHAR * ProductName,_TCHAR * new_ComputerName, bool Child) { _TCHAR Messg[255]; m_dwCurrentView = IDC_VIEW_BY_HOTFIX; m_bChild = Child; _tcscpy (m_szComputerName, new_ComputerName); b_Expanded = false; // Image indexes may need to be modified depending on the images specific to // the snapin. // Image indexes may need to be modified depending on the images specific to // the snapin. memset(&m_scopeDataItem, 0, sizeof(SCOPEDATAITEM)); m_scopeDataItem.mask = SDI_STR | SDI_IMAGE | SDI_OPENIMAGE | SDI_PARAM; m_scopeDataItem.displayname = MMC_CALLBACK; m_scopeDataItem.nImage = 4; // May need modification m_scopeDataItem.nOpenImage = 5; // May need modification m_scopeDataItem.lParam = (LPARAM) this; memset(&m_resultDataItem, 4, sizeof(RESULTDATAITEM)); m_resultDataItem.mask = RDI_STR | RDI_IMAGE | RDI_PARAM; m_resultDataItem.str = MMC_CALLBACK; m_resultDataItem.nImage = 4; // May need modification m_resultDataItem.lParam = (LPARAM) this; if (ProductName == NULL) { LoadString(_Module.GetResourceInstance(),IDS_DISPLAY_NAME,Messg,255); _tcscpy(m_ProductName,_T("\0")); } else { _tcscpy(Messg,ProductName); _tcscpy(m_ProductName,ProductName); } m_bstrDisplayName = SysAllocString(Messg); LoadString(_Module.GetResourceInstance(),IDS_COLUMN_TYPE,Messg,255); m_bstrColumnType = SysAllocString(Messg); LoadString(_Module.GetResourceInstance(),IDS_COLUMN_DESC,Messg,255); m_bstrColumnDesc = SysAllocString( Messg ); } ~CHotfix_ManagerData() { } STDMETHOD(GetScopePaneInfo)(SCOPEDATAITEM *pScopeDataItem); STDMETHOD( GetResultViewType )( LPOLESTR* ppViewType, long* pViewOptions ); STDMETHOD(GetResultPaneInfo)(RESULTDATAITEM *pResultDataItem); STDMETHOD(Notify)( MMC_NOTIFY_TYPE event, long arg, long param, IComponentData* pComponentData, IComponent* pComponent, DATA_OBJECT_TYPES type); LPOLESTR GetResultPaneColInfo(int nCol); BOOL SendProductName(_TCHAR *szPoductName, IDispatch * pDisp); BOOL SendComputerName(_TCHAR *szDataMachineName,IDispatch * pDisp); BOOL SendCommand( LPARAM lparamCommand ); STDMETHOD( Command )(long lCommandID, CSnapInObjectRootBase* pObj, DATA_OBJECT_TYPES type); STDMETHOD(AddMenuItems)( LPCONTEXTMENUCALLBACK pContextMenuCallback, long *pInsertionAllowed, DATA_OBJECT_TYPES type); }; DWORD GetCtrlStatus(); class CHotfix_ManagerExtData : public CSnapInItemImpl { public: static const GUID* m_NODETYPE; static const OLECHAR* m_SZNODETYPE; static const OLECHAR* m_SZDISPLAY_NAME; static const CLSID* m_SNAPIN_CLASSID; BEGIN_SNAPINCOMMAND_MAP(CHotfix_ManagerExtData, FALSE) END_SNAPINCOMMAND_MAP() // SNAPINMENUID(IDR_HOTFIXMANAGER_MENU) BEGIN_SNAPINTOOLBARID_MAP(CHotfix_ManagerExtData) // Create toolbar resources with button dimensions 16x16 // and add an entry to the MAP. You can add multiple toolbars // SNAPINTOOLBARID_ENTRY(Toolbar ID) END_SNAPINTOOLBARID_MAP() CHotfix_ManagerExtData() { m_pNode = NULL; memset(&m_scopeDataItem, 0, sizeof(SCOPEDATAITEM)); memset(&m_resultDataItem, 0, sizeof(RESULTDATAITEM)); } ~CHotfix_ManagerExtData() { if ( m_pNode != NULL ) delete m_pNode; } IDataObject* m_pDataObject; virtual void InitDataClass(IDataObject* pDataObject, CSnapInItem* pDefault) { m_pDataObject = pDataObject; // The default code stores off the pointer to the Dataobject the class is wrapping // at the time. // Alternatively you could convert the dataobject to the internal format // it represents and store that information } CSnapInItem* GetExtNodeObject(IDataObject* pDataObject, CSnapInItem* pDefault) { // Modify to return a different CSnapInItem* pointer. return pDefault; } STDMETHOD(Notify)( MMC_NOTIFY_TYPE event, long arg, long param, IComponentData* pComponentData, IComponent* pComponent, DATA_OBJECT_TYPES type); STDMETHOD(GetDisplayInfo)(SCOPEDATAITEM *pScopeDataItem) { return( S_OK ); } protected: CSnapInItem* m_pNode; }; class CHotfix_Manager; class CHotfix_ManagerComponent : public CComObjectRootEx, public CSnapInObjectRoot<2, CHotfix_Manager >, public IExtendContextMenuImpl, // public IExtendControlbarImpl, public IPersistStreamInit, public IComponentImpl { public: BEGIN_COM_MAP(CHotfix_ManagerComponent) COM_INTERFACE_ENTRY(IComponent) COM_INTERFACE_ENTRY(IExtendContextMenu) // COM_INTERFACE_ENTRY(IExtendControlbar) COM_INTERFACE_ENTRY(IPersistStreamInit) END_COM_MAP() // SNAPINMENUID(IDR_HOTFIXMANAGER_MENU) public: CHotfix_ManagerComponent() { } STDMETHOD(Notify)(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, long arg, long param) { // // Check for a special data object being sent. // Might be able to extract the computer name here.... if ( IS_SPECIAL_DATAOBJECT( lpDataObject ) ) return( S_OK ); if (lpDataObject != NULL) return IComponentImpl::Notify(lpDataObject, event, arg, param); // TODO : Add code to handle notifications that set lpDataObject == NULL. return E_NOTIMPL; } STDMETHOD(GetClassID)(CLSID *pClassID) { ATLTRACENOTIMPL(_T("CHotfix_ManagerComponent::GetClassID")); } STDMETHOD(IsDirty)() { ATLTRACENOTIMPL(_T("CHotfix_ManagerComponent::IsDirty")); } STDMETHOD(Load)(IStream *pStm) { ATLTRACENOTIMPL(_T("CHotfix_ManagerComponent::Load")); } STDMETHOD(Save)(IStream *pStm, BOOL fClearDirty) { ATLTRACENOTIMPL(_T("CHotfix_ManagerComponent::Save")); } STDMETHOD(GetSizeMax)(ULARGE_INTEGER *pcbSize) { ATLTRACENOTIMPL(_T("CHotfix_ManagerComponent::GetSizeMax")); } STDMETHOD(Command)(long lCommandID, LPDATAOBJECT pDataObject); STDMETHOD(InitNew)() { ATLTRACE(_T("CHotfix_ManagerComponent::InitNew\n")); return S_OK; } STDMETHOD (AddMenuItems) (LPDATAOBJECT pDataObject, LPCONTEXTMENUCALLBACK piCallback,long *pInsertionAllowed); }; class CHotfix_Manager : public CComObjectRootEx, public CSnapInObjectRoot<1, CHotfix_Manager>, public IComponentDataImpl, public IExtendControlbarImpl, public IExtendContextMenuImpl, public IPersistStreamInit, public ISnapinHelpImpl, public CComCoClass { public: CHotfix_Manager(); bool IsRemoted() { return( m_fRemoted ); } ~CHotfix_Manager() { delete m_pNode; m_pNode = NULL; } EXTENSION_SNAPIN_DATACLASS(CHotfix_ManagerExtData) BEGIN_EXTENSION_SNAPIN_NODEINFO_MAP(CHotfix_Manager) EXTENSION_SNAPIN_NODEINFO_ENTRY(CHotfix_ManagerExtData) END_EXTENSION_SNAPIN_NODEINFO_MAP() BEGIN_COM_MAP(CHotfix_Manager) COM_INTERFACE_ENTRY(IComponentData) COM_INTERFACE_ENTRY(IExtendControlbar) COM_INTERFACE_ENTRY(IExtendContextMenu) COM_INTERFACE_ENTRY(IPersistStreamInit) COM_INTERFACE_ENTRY(ISnapinHelp) END_COM_MAP() DECLARE_REGISTRY_RESOURCEID(IDR_HOTFIXMANAGER) DECLARE_NOT_AGGREGATABLE(CHotfix_Manager) STDMETHOD(GetClassID)(CLSID *pClassID) { ATLTRACENOTIMPL(_T("CHotfix_Manager::GetClassID")); } STDMETHOD(IsDirty)() { ATLTRACENOTIMPL(_T("CHotfix_Manager::IsDirty")); } STDMETHOD(Load)(IStream *pStm) { ATLTRACENOTIMPL(_T("CHotfix_Manager::Load")); } STDMETHOD(Save)(IStream *pStm, BOOL fClearDirty) { ATLTRACENOTIMPL(_T("CHotfix_Manager::Save")); } STDMETHOD(GetSizeMax)(ULARGE_INTEGER *pcbSize) { ATLTRACENOTIMPL(_T("CHotfix_Manager::GetSizeMax")); } STDMETHOD(InitNew)() { ATLTRACE(_T("CHotfix_Manager::InitNew\n")); return S_OK; } STDMETHOD(Initialize)(LPUNKNOWN pUnknown); static void WINAPI ObjectMain(bool bStarting) { if (bStarting) CSnapInItem::Init(); } STDMETHOD(Notify)( LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param); protected: _TCHAR m_szComputerName[255]; bool ExtractString( IDataObject* pDataObject, unsigned int cfClipFormat, LPTSTR pBuf, DWORD dwMaxLength ); // // Register the clipboard format and get the value to query on. // void RegisterRemotedClass() { m_ccfRemotedFormat = RegisterClipboardFormat( _T( "MMC_SNAPIN_MACHINE_NAME" ) ); _ASSERTE( m_ccfRemotedFormat > 0 ); } // // Determine if we're monitoring a local or remote machine based on the given data object. // bool IsDataObjectRemoted( IDataObject* pDataObject ); // // Used to track whether we're remoted or not. // bool m_fRemoted; // // Initialized by RegisterRemoteClass(). Contains the clipboard ID // of MMC_SNAPIN_MACHINE_NAME after registered with the clipboard. // UINT m_ccfRemotedFormat; }; class ATL_NO_VTABLE CHotfix_ManagerAbout : public ISnapinAbout, public CComObjectRoot, public CComCoClass< CHotfix_ManagerAbout, &CLSID_Hotfix_ManagerAbout> { public: DECLARE_REGISTRY(CHotfixManagerAbout, _T("Hotfix_ManagerAbout.1"), _T("Hotfix_ManagerAbout.1"), IDS_HOTFIXMANAGER_DESC, THREADFLAGS_BOTH); BEGIN_COM_MAP(CHotfix_ManagerAbout) COM_INTERFACE_ENTRY(ISnapinAbout) END_COM_MAP() STDMETHOD(GetSnapinDescription)(LPOLESTR *lpDescription) { USES_CONVERSION; TCHAR szBuf[256]; if (::LoadString(_Module.GetResourceInstance(), IDS_HOTFIXMANAGER_DESC, szBuf, 256) == 0) return E_FAIL; *lpDescription = (LPOLESTR)CoTaskMemAlloc((lstrlen(szBuf) + 1) * sizeof(OLECHAR)); if (*lpDescription == NULL) return E_OUTOFMEMORY; ocscpy(*lpDescription, T2OLE(szBuf)); return S_OK; } STDMETHOD(GetProvider)(LPOLESTR *lpName) { USES_CONVERSION; TCHAR szBuf[256]; if (::LoadString(_Module.GetResourceInstance(), IDS_HOTFIXMANAGER_PROVIDER, szBuf, 256) == 0) return E_FAIL; *lpName = (LPOLESTR)CoTaskMemAlloc((lstrlen(szBuf) + 1) * sizeof(OLECHAR)); if (*lpName == NULL) return E_OUTOFMEMORY; ocscpy(*lpName, T2OLE(szBuf)); return S_OK; } STDMETHOD(GetSnapinVersion)(LPOLESTR *lpVersion) { USES_CONVERSION; TCHAR szBuf[256]; if (::LoadString(_Module.GetResourceInstance(), IDS_HOTFIXMANAGER_VERSION, szBuf, 256) == 0) return E_FAIL; *lpVersion = (LPOLESTR)CoTaskMemAlloc((lstrlen(szBuf) + 1) * sizeof(OLECHAR)); if (*lpVersion == NULL) return E_OUTOFMEMORY; ocscpy(*lpVersion, T2OLE(szBuf)); return S_OK; } STDMETHOD(GetSnapinImage)(HICON *hAppIcon) { *hAppIcon = NULL; return S_OK; } STDMETHOD(GetStaticFolderImage)(HBITMAP *hSmallImage, HBITMAP *hSmallImageOpen, HBITMAP *hLargeImage, COLORREF *cMask) { *hSmallImageOpen = *hLargeImage = *hLargeImage = 0; return S_OK; } }; #endif