📄 warmmcbasenode.h
字号:
/** This module is shamelessly stolen from www.codeguru.com * http://www.codeguru.com/atl/MMCSnapInTutorial.html * from an article by Leon Finker * */#ifndef WAR_MMC_BASE_NODE_H#define WAR_MMC_BASE_NODE_H/* SYSTEM INCLUDES *//* PROJECT INCLUDES *//* LOCAL INCLUDES *//* FORWARD REFERENCES */#ifdef __cplusplusextern "C" {#endif/****************** BEGIN OLD STYLE C spesific ********//****************** END OLD STYLE C spesific **********/#ifdef __cplusplus }#endif/****************** BEGIN C++ spesific ****************/template <class T>class ATL_NO_VTABLE WarMmcBaseNode : public CSnapInItemImpl<T>{public: static const GUID* m_NODETYPE; static const OLECHAR* m_SZNODETYPE; static const OLECHAR* m_SZDISPLAY_NAME; static const CLSID* m_SNAPIN_CLASSID; CComPtr<IConsole> mpConsole; WarMmcBaseNode() { m_bstrDisplayName = m_SZDISPLAY_NAME; } virtual ~WarMmcBaseNode() { } // CSnapInItemImpl STDMETHOD(GetScopePaneInfo)(SCOPEDATAITEM *pScopeDataItem) { if (pScopeDataItem->mask & SDI_STR) pScopeDataItem->displayname = m_bstrDisplayName; if (pScopeDataItem->mask & SDI_IMAGE) pScopeDataItem->nImage = m_scopeDataItem.nImage; if (pScopeDataItem->mask & SDI_OPENIMAGE) pScopeDataItem->nOpenImage = m_scopeDataItem.nOpenImage; if (pScopeDataItem->mask & SDI_PARAM) pScopeDataItem->lParam = m_scopeDataItem.lParam; if (pScopeDataItem->mask & SDI_STATE ) pScopeDataItem->nState = m_scopeDataItem.nState; return S_OK; } // CSnapInItemImpl STDMETHOD(GetResultPaneInfo)(RESULTDATAITEM *pResultDataItem) { if (pResultDataItem->bScopeItem) { if (pResultDataItem->mask & RDI_STR) pResultDataItem->str = GetResultPaneColInfo(pResultDataItem->nCol); if (pResultDataItem->mask & RDI_IMAGE) pResultDataItem->nImage = m_scopeDataItem.nImage; if (pResultDataItem->mask & RDI_PARAM) pResultDataItem->lParam = m_scopeDataItem.lParam; return S_OK; } if (pResultDataItem->mask & RDI_STR) pResultDataItem->str = GetResultPaneColInfo(pResultDataItem->nCol); if (pResultDataItem->mask & RDI_IMAGE) pResultDataItem->nImage = m_resultDataItem.nImage; if (pResultDataItem->mask & RDI_PARAM) pResultDataItem->lParam = m_resultDataItem.lParam; if (pResultDataItem->mask & RDI_INDEX) pResultDataItem->nIndex = m_resultDataItem.nIndex; return S_OK; } virtual LPOLESTR GetResultPaneColInfo(int nCol) { return m_bstrDisplayName; } // CSnapInItemImpl STDMETHOD(Notify)(MMC_NOTIFY_TYPE event, long arg, long param, IComponentData* pComponentData, IComponent* pComponent, DATA_OBJECT_TYPES type) { // Add code to handle the different notifications. // Handle MMCN_SHOW and MMCN_EXPAND to enumerate children items. // In response to MMCN_SHOW you have to enumerate both the scope // and result pane items. // For MMCN_EXPAND you only need to enumerate the scope items // Use IConsoleNameSpace::InsertItem to insert scope pane items // Use IResultData::InsertItem to insert result pane item. HRESULT hr = E_NOTIMPL; _ASSERTE(pComponentData != NULL || pComponent != NULL); CComPtr<IConsole> spConsole; CComQIPtr<IHeaderCtrl, &IID_IHeaderCtrl> spHeader; if (pComponentData != NULL) spConsole = ((CWarSvrSnapin*)pComponentData)->m_spConsole; else { mpConsole = spConsole = ((CWarSvrSnapinComponent*)pComponent)->m_spConsole; spHeader = mpConsole; } switch (event) { case MMCN_CONTEXTHELP: //hr = OnShowContextHelp(((CWarSvrSnapinComponent*)pComponent)->m_ipDisplayHelp); break; case MMCN_SHOW: { hr=OnShow(spConsole, arg); break; } case MMCN_EXPAND: { hr = OnExpand(arg, spConsole, param); break; } case MMCN_ADD_IMAGES: { hr = OnAddImages((IImageList*) arg); break; } case MMCN_DBLCLICK: { hr = spConsole->SelectScopeItem(m_scopeDataItem.ID); break; } case MMCN_SELECT: { hr = OnSelect(spConsole, pComponent); break; } case MMCN_RENAME: { hr = OnRename(spConsole, (LPOLESTR)param); break; } case MMCN_VIEW_CHANGE: { hr = OnChange(spConsole, (LPARAM)arg, (LONG_PTR)param); } break; } return hr; } HRESULT OnAddImages(IImageList* pImageList) { return CWarSvrSnapin::LoadImages(pImageList); } // CSnapInItemImpl STDMETHOD(CreatePropertyPages)(LPPROPERTYSHEETCALLBACK lpProvider,long handle, IUnknown* pUnk,DATA_OBJECT_TYPES type) { return S_FALSE; } // CSnapInItemImpl STDMETHOD(QueryPagesFor)(DATA_OBJECT_TYPES type) { return S_FALSE; } // virtual functions called by Notify //MMCN_CONTEXTHELP virtual HRESULT OnShowContextHelp(IDisplayHelp *pDisplayHelp) { return S_FALSE; } //MMCN_EXAPND virtual HRESULT OnExpand(BOOL bExpand, IConsole *pConsole, HSCOPEITEM parent) { return S_OK; } //MMCN_SHOW virtual HRESULT OnShow(IConsole *pConsole, BOOL bShow) { return S_FALSE; } //MMCN_SELECT virtual HRESULT OnSelect(IConsole *mpConsole, IComponent* pComponent ) { return S_FALSE; } //MMCN_RENAME virtual HRESULT OnRename(IConsole* pConsole, LPOLESTR param) { return S_FALSE; } virtual HRESULT OnChange(IConsole* pConsole, LPARAM data, LONG_PTR hint) { return S_FALSE; } // Rename a node. virtual HRESULT Rename(IConsole* pConsole, LPOLESTR param) { CComQIPtr<IConsoleNameSpace, &IID_IConsoleNameSpace> spConsoleNameSpace(pConsole); m_bstrDisplayName = param; m_scopeDataItem.displayname = m_bstrDisplayName; spConsoleNameSpace->SetItem(&m_scopeDataItem); return S_OK; } //this function can be used either for result or scope items, by checking the m_nType HRESULT InvokeWizzard(bool& bHandled, CSnapInObjectRootBase* pObj) { CComPtr<IUnknown> pUnk; HRESULT hr = CoCreateInstance(CLSID_NodeManager, NULL,CLSCTX_INPROC_SERVER,IID_IPropertySheetProvider, (void**)&pUnk); if (FAILED(hr)) return S_FALSE; CComQIPtr<IPropertySheetProvider,&IID_IPropertySheetProvider> spPSProvider(pUnk); CComPtr<IDataObject> spDataObject; hr = GetDataObject(&spDataObject, CCT_SCOPE); if (FAILED(hr)) return S_FALSE; hr = spPSProvider->CreatePropertySheet(L"Property", FALSE, (long)this, spDataObject,MMC_PSO_NEWWIZARDTYPE); if (FAILED(hr)) return hr; _ASSERTE(pObj != NULL && (pObj->m_nType == 1 || pObj->m_nType == 2)); HWND hWnd=NULL; if (pObj->m_nType == 2) // Result Pane { IComponent* pComponent; hr = ((CWarSvrSnapinComponent*)pObj)->QueryInterface(IID_IComponent, (void**)&pComponent); spPSProvider->AddPrimaryPages(pComponent, TRUE, NULL, FALSE); if(pComponent != NULL) pComponent->Release(); ((CWarSvrSnapinComponent*)pObj)->m_spConsole->GetMainWindow(&hWnd); } else //scope pane { IComponentData* pComponentData; hr = ((CWarSvrSnapin*)pObj)->QueryInterface(IID_IComponentData, (void**)&pComponentData); spPSProvider->AddPrimaryPages(pComponentData, TRUE, NULL, TRUE); if(pComponentData != NULL) pComponentData->Release(); ((CWarSvrSnapin*)pObj)->m_spConsole->GetMainWindow(&hWnd); } hr = spPSProvider->Show((long)hWnd,0); if (hr == S_FALSE) // recover from a failed Show { spPSProvider->Show(-1,0); // frees wizard resources // held by MMC return S_FALSE; } return hr; } };#ifdef __cplusplus/* INLINE METHODS *//* EXTERNAL REFERENCES */#endif /* __cplusplus *//****************** END C++ spesific ******************/#endif /* WAR_MMC_BASE_NODE_H_ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -