#include "stdafx.h" #include "DomMigSI.h" #include "DomMigr.h" #include "MultiSel.h" #include #include "TReg.hpp" #include "ResStr.h" HRESULT GetHelpFileFullPath( BSTR *bstrHelp ) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); CString strPath, strName; TRegKey key; TCHAR szModule[2*_MAX_PATH]; DWORD dwReturn = 0; LPOLESTR lpHelpFile; //mmc requires we use CoTaskMemAlloc to allocate memory returned from //this function lpHelpFile = (LPOLESTR) CoTaskMemAlloc( 2 * MAX_PATH * sizeof(WCHAR) ); if ( !lpHelpFile ) { return E_OUTOFMEMORY; } dwReturn = key.Open(GET_STRING(IDS_DOMAIN_ADMIN_REGKEY),HKEY_LOCAL_MACHINE); if ( ! dwReturn ) { dwReturn = key.ValueGetStr(L"Directory",szModule,DIM(szModule)); if (! dwReturn ) { strPath = szModule; strPath += L"\\"; strName.LoadString(IDS_HELPFILE); strPath += strName; } } wcscpy(lpHelpFile, strPath); *bstrHelp = lpHelpFile; return HRESULT_FROM_WIN32(dwReturn); } ///////////////////////////////////////////////////////////////////////////// // CDomMigratorComponentData static const GUID CDomMigratorGUID_NODETYPE = { 0xe1975d72, 0x3f8e, 0x11d3, { 0x99, 0xee, 0x0, 0xc0, 0x4f, 0x39, 0xbd, 0x92 } }; HRESULT CDomMigrator::Initialize(LPUNKNOWN pUnknown) { HRESULT hr = IComponentDataImpl::Initialize(pUnknown); if (FAILED(hr)) return hr; CComPtr spImageList; if (m_spConsole->QueryScopeImageList(&spImageList) != S_OK) { ATLTRACE(_T("IConsole::QueryScopeImageList failed\n")); return E_UNEXPECTED; } // Load bitmaps associated with the scope pane // and add them to the image list // Loads the default bitmaps generated by the wizard // Change as required HBITMAP hBitmap16 = LoadBitmap(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDB_TOOL_16)); if (hBitmap16 == NULL) return S_OK; HBITMAP hBitmap32 = LoadBitmap(_Module.GetResourceInstance(), MAKEINTRESOURCE(IDB_TOOL_32)); if (hBitmap32 == NULL) { DeleteObject(hBitmap16); return S_OK; } // if (spImageList->ImageListSetStrip((long*)hBitmap16, // (long*)hBitmap32, 0, RGB(0, 128, 128)) != S_OK) if (spImageList->ImageListSetStrip((LONG_PTR*)hBitmap16, (LONG_PTR*)hBitmap32, 0, RGB(0, 128, 128)) != S_OK) { ATLTRACE(_T("IImageList::ImageListSetStrip failed\n")); DeleteObject(hBitmap16); DeleteObject(hBitmap32); return E_UNEXPECTED; } DeleteObject(hBitmap16); DeleteObject(hBitmap32); // setting root node handle to main window // so that the root node may disable the main // window when a wizard is active HWND hwndMainWindow = 0; m_spConsole->GetMainWindow(&hwndMainWindow); if (m_pNode) { ((CRootNode*)m_pNode)->SetMainWindow(hwndMainWindow); } return S_OK; } STDMETHODIMP CDomMigratorComponent::AddMenuItems( LPDATAOBJECT pDataObject, LPCONTEXTMENUCALLBACK piCallback, long * pInsertionAllowed ) { ATLTRACE2(atlTraceSnapin, 0, _T("IExtendContextMenuImpl::AddMenuItems\n")); HRESULT hr = E_POINTER; ATLASSERT(pDataObject != NULL); if (pDataObject == NULL) { ATLTRACE2(atlTraceSnapin, 0, _T("IExtendContextMenu::AddMenuItems called with pDataObject==NULL\n")); } else { CSnapInItem * pItem; DATA_OBJECT_TYPES type; hr = m_pComponentData->GetDataClass(pDataObject, &pItem, &type); if (SUCCEEDED(hr)) { hr = pItem->AddMenuItems(piCallback, pInsertionAllowed, type); } else { // is it multiselection data SMMCDataObjects *pMsDataObjs = CMultiSelectItemDataObject::ExtractMSDataObjects(pDataObject); if ((pMsDataObjs) && ( pMsDataObjs->count )) { LPDATAOBJECT pMsData; pMsData = pMsDataObjs->lpDataObject[0]; FORMATETC format={(CLIPFORMAT)CMultiSelectItemDataObject::s_cfMsObjTypes,NULL,DVASPECT_CONTENT,-1,TYMED_HGLOBAL}; hr = pMsData->QueryGetData(&format); if ( hr == S_OK ) { hr = ((CMultiSelectItemDataObject *)pMsData)->AddMenuItems(piCallback, pInsertionAllowed, type); } } } } return hr; } STDMETHODIMP CDomMigratorComponent::Command(long lCommandID, LPDATAOBJECT pDataObject) { ATLTRACE2(atlTraceSnapin, 0, _T("IExtendContextMenuImpl::Command\n")); HRESULT hr = E_POINTER; ATLASSERT(pDataObject != NULL); if (pDataObject == NULL) ATLTRACE2(atlTraceSnapin, 0, _T("IExtendContextMenu::Command called with pDataObject==NULL\n")); else { CSnapInItem * pItem; DATA_OBJECT_TYPES type; hr = m_pComponentData->GetDataClass(pDataObject, &pItem, &type); if (SUCCEEDED(hr)) { hr = pItem->Command(lCommandID, (CSnapInObjectRootBase*)this, type); } else { // is it multiselection data SMMCDataObjects *pMsDataObjs = CMultiSelectItemDataObject::ExtractMSDataObjects(pDataObject); if ((pMsDataObjs) && ( pMsDataObjs->count )) { LPDATAOBJECT pMsData; pMsData = pMsDataObjs->lpDataObject[0]; FORMATETC format={(CLIPFORMAT)CMultiSelectItemDataObject::s_cfMsObjTypes,NULL,DVASPECT_CONTENT,-1,TYMED_HGLOBAL}; HRESULT hr = pMsData->QueryGetData(&format); if ( hr == S_OK ) { hr = ((CMultiSelectItemDataObject *)pMsData)->Command(lCommandID, (CSnapInObjectRootBase*)this, type); } } } } return hr; } CDomMigrator::CDomMigrator() { AFX_MANAGE_STATE(AfxGetStaticModuleState()); m_pNode = new CRootNode; _ASSERTE(m_pNode != NULL); m_pComponentData = this; m_lpszSnapinHelpFile.LoadString(IDS_HELPFILE); } CDomMigrator::~CDomMigrator() { if (m_pNode) delete m_pNode; m_pNode = NULL; } /* On the Help menu, there should be 1 Help Topics option that displays a Contents list with both our Help and the MMC Help. */ STDMETHODIMP CDomMigrator::GetHelpTopic(LPOLESTR* lpCompiledHelpFile) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); if (lpCompiledHelpFile == NULL) return E_INVALIDARG; if (m_lpszSnapinHelpFile.IsEmpty() ) { *lpCompiledHelpFile = NULL; return E_NOTIMPL; } return GetHelpFileFullPath(lpCompiledHelpFile); } STDMETHODIMP CDomMigrator::GetLinkedTopics(LPOLESTR* lpCompiledHelpFile) { AFX_MANAGE_STATE(AfxGetStaticModuleState()); if (lpCompiledHelpFile == NULL) return E_INVALIDARG; return GetHelpFileFullPath(lpCompiledHelpFile); }