You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
500 lines
13 KiB
500 lines
13 KiB
#include "main.h"
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// CSnapIn object implementation //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
CSnapIn::CSnapIn(CComponentData *pComponent)
|
|
{
|
|
m_cRef = 1;
|
|
InterlockedIncrement(&g_cRefThisDll);
|
|
|
|
m_pcd = pComponent;
|
|
|
|
m_pConsole = NULL;
|
|
m_pResult = NULL;
|
|
m_pHeader = NULL;
|
|
m_pConsoleVerb = NULL;
|
|
m_pDisplayHelp = NULL;
|
|
m_nColumnSize = 180;
|
|
m_lViewMode = LVS_REPORT;
|
|
m_bExpand = TRUE;
|
|
|
|
LoadString(g_hInstance, IDS_NAME, m_column1, ARRAYSIZE(m_column1));
|
|
}
|
|
|
|
CSnapIn::~CSnapIn()
|
|
{
|
|
InterlockedDecrement(&g_cRefThisDll);
|
|
}
|
|
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// CSnapIn object implementation (IUnknown) //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
|
|
HRESULT CSnapIn::QueryInterface (REFIID riid, void **ppv)
|
|
{
|
|
if (IsEqualIID(riid, IID_IComponent) || IsEqualIID(riid, IID_IUnknown))
|
|
{
|
|
*ppv = (LPCOMPONENT)this;
|
|
m_cRef++;
|
|
return S_OK;
|
|
}
|
|
else if (IsEqualIID(riid, IID_IExtendContextMenu))
|
|
{
|
|
*ppv = (LPEXTENDCONTEXTMENU)this;
|
|
m_cRef++;
|
|
return S_OK;
|
|
}
|
|
else
|
|
{
|
|
*ppv = NULL;
|
|
return E_NOINTERFACE;
|
|
}
|
|
}
|
|
|
|
ULONG CSnapIn::AddRef (void)
|
|
{
|
|
return ++m_cRef;
|
|
}
|
|
|
|
ULONG CSnapIn::Release (void)
|
|
{
|
|
if (--m_cRef == 0) {
|
|
delete this;
|
|
return 0;
|
|
}
|
|
|
|
return m_cRef;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// CSnapIn object implementation (IComponent) //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
STDMETHODIMP CSnapIn::Initialize(LPCONSOLE lpConsole)
|
|
{
|
|
HRESULT hr;
|
|
|
|
// Save the IConsole pointer
|
|
m_pConsole = lpConsole;
|
|
m_pConsole->AddRef();
|
|
|
|
hr = m_pConsole->QueryInterface(IID_IHeaderCtrl,
|
|
reinterpret_cast<void**>(&m_pHeader));
|
|
|
|
// Give the console the header control interface pointer
|
|
if (SUCCEEDED(hr))
|
|
m_pConsole->SetHeader(m_pHeader);
|
|
|
|
m_pConsole->QueryInterface(IID_IResultData,
|
|
reinterpret_cast<void**>(&m_pResult));
|
|
|
|
hr = m_pConsole->QueryConsoleVerb(&m_pConsoleVerb);
|
|
|
|
hr = m_pConsole->QueryInterface(IID_IDisplayHelp,
|
|
reinterpret_cast<void**>(&m_pDisplayHelp));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CSnapIn::Destroy(MMC_COOKIE cookie)
|
|
{
|
|
|
|
if (m_pConsole != NULL)
|
|
{
|
|
m_pConsole->SetHeader(NULL);
|
|
m_pConsole->Release();
|
|
m_pConsole = NULL;
|
|
}
|
|
|
|
if (m_pHeader != NULL)
|
|
{
|
|
m_pHeader->Release();
|
|
m_pHeader = NULL;
|
|
}
|
|
if (m_pResult != NULL)
|
|
{
|
|
m_pResult->Release();
|
|
m_pResult = NULL;
|
|
}
|
|
|
|
if (m_pConsoleVerb != NULL)
|
|
{
|
|
m_pConsoleVerb->Release();
|
|
m_pConsoleVerb = NULL;
|
|
}
|
|
|
|
if (m_pDisplayHelp != NULL)
|
|
{
|
|
m_pDisplayHelp->Release();
|
|
m_pDisplayHelp = NULL;
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CSnapIn::Notify(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param)
|
|
{
|
|
HRESULT hr = S_OK;
|
|
|
|
|
|
switch(event)
|
|
{
|
|
case MMCN_COLUMNS_CHANGED:
|
|
hr = S_OK;
|
|
break;
|
|
|
|
case MMCN_DBLCLICK:
|
|
hr = S_FALSE;
|
|
break;
|
|
|
|
case MMCN_ADD_IMAGES:
|
|
HBITMAP hbmp16x16;
|
|
HBITMAP hbmp32x32;
|
|
|
|
hbmp16x16 = LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_16x16));
|
|
|
|
if (hbmp16x16)
|
|
{
|
|
hbmp32x32 = LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_32x32));
|
|
|
|
if (hbmp32x32)
|
|
{
|
|
LPIMAGELIST pImageList = (LPIMAGELIST) arg;
|
|
|
|
// Set the images
|
|
pImageList->ImageListSetStrip(reinterpret_cast<LONG_PTR *>(hbmp16x16),
|
|
reinterpret_cast<LONG_PTR *>(hbmp32x32),
|
|
0, RGB(255, 0, 255));
|
|
|
|
DeleteObject(hbmp32x32);
|
|
}
|
|
|
|
DeleteObject(hbmp16x16);
|
|
}
|
|
break;
|
|
|
|
case MMCN_SHOW:
|
|
if (arg == TRUE)
|
|
{
|
|
RESULTDATAITEM resultItem;
|
|
LPGPEDATAOBJECT pGPEDataObject;
|
|
MMC_COOKIE cookie;
|
|
INT i;
|
|
LPCONSOLE2 lpConsole2;
|
|
|
|
//
|
|
// Get the cookie of the scope pane item
|
|
//
|
|
|
|
hr = lpDataObject->QueryInterface(IID_IGPEDataObject, (LPVOID *)&pGPEDataObject);
|
|
|
|
if (FAILED(hr))
|
|
return S_OK;
|
|
|
|
hr = pGPEDataObject->GetCookie(&cookie);
|
|
|
|
pGPEDataObject->Release(); // release initial ref
|
|
if (FAILED(hr))
|
|
return S_OK;
|
|
|
|
|
|
//
|
|
// Prepare the view
|
|
//
|
|
|
|
m_pHeader->InsertColumn(0, m_column1, LVCFMT_LEFT, m_nColumnSize);
|
|
m_pResult->SetViewMode(m_lViewMode);
|
|
|
|
|
|
//
|
|
// Add result pane items for this node
|
|
//
|
|
|
|
for (i = 0; i < g_NameSpace[cookie].cResultItems; i++)
|
|
{
|
|
resultItem.mask = RDI_STR | RDI_IMAGE | RDI_PARAM;
|
|
resultItem.str = MMC_CALLBACK;
|
|
resultItem.nImage = g_NameSpace[cookie].pResultItems[i].iImage;
|
|
resultItem.lParam = (LPARAM) &g_NameSpace[cookie].pResultItems[i];
|
|
m_pResult->InsertItem(&resultItem);
|
|
}
|
|
|
|
m_pResult->Sort(0, 0, -1);
|
|
|
|
if (m_bExpand)
|
|
{
|
|
hr = m_pConsole->QueryInterface(IID_IConsole2,
|
|
reinterpret_cast<void**>(&lpConsole2));
|
|
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
if (m_pcd->m_hRoot)
|
|
{
|
|
lpConsole2->Expand(m_pcd->m_hRoot, TRUE);
|
|
}
|
|
|
|
if (m_pcd->m_hMachine)
|
|
{
|
|
lpConsole2->Expand(m_pcd->m_hMachine, TRUE);
|
|
}
|
|
|
|
if (m_pcd->m_hUser)
|
|
{
|
|
lpConsole2->Expand(m_pcd->m_hUser, TRUE);
|
|
}
|
|
|
|
lpConsole2->Release();
|
|
}
|
|
|
|
m_bExpand = FALSE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
m_pHeader->GetColumnWidth(0, &m_nColumnSize);
|
|
m_pResult->GetViewMode(&m_lViewMode);
|
|
}
|
|
break;
|
|
|
|
case MMCN_SELECT:
|
|
|
|
if (m_pConsoleVerb)
|
|
{
|
|
LPRESULTITEM pItem;
|
|
LPGPEDATAOBJECT pGPEDataObject;
|
|
DATA_OBJECT_TYPES type;
|
|
MMC_COOKIE cookie;
|
|
|
|
//
|
|
// Set the default verb to open
|
|
//
|
|
|
|
m_pConsoleVerb->SetDefaultVerb(MMC_VERB_OPEN);
|
|
|
|
|
|
//
|
|
// See if this is one of our items.
|
|
//
|
|
|
|
hr = lpDataObject->QueryInterface(IID_IGPEDataObject, (LPVOID *)&pGPEDataObject);
|
|
|
|
if (FAILED(hr))
|
|
break;
|
|
|
|
pGPEDataObject->GetType(&type);
|
|
pGPEDataObject->GetCookie(&cookie);
|
|
|
|
pGPEDataObject->Release();
|
|
|
|
|
|
//
|
|
// If this is a result pane item or the root of the namespace
|
|
// nodes, enable the Properties menu item
|
|
//
|
|
|
|
if (m_pcd->m_pGPO)
|
|
{
|
|
if ((type == CCT_RESULT) || ((type == CCT_SCOPE) && (cookie == 0)))
|
|
{
|
|
m_pConsoleVerb->SetVerbState(MMC_VERB_PROPERTIES, ENABLED, TRUE);
|
|
|
|
|
|
//
|
|
// If this is a result pane item, then change the default
|
|
// verb to Properties.
|
|
//
|
|
|
|
if (type == CCT_RESULT)
|
|
m_pConsoleVerb->SetDefaultVerb(MMC_VERB_PROPERTIES);
|
|
}
|
|
}
|
|
}
|
|
break;
|
|
|
|
case MMCN_CONTEXTHELP:
|
|
{
|
|
|
|
if (m_pDisplayHelp)
|
|
{
|
|
LPOLESTR pszHelpTopic;
|
|
LPGPEDATAOBJECT pGPEDataObject;
|
|
MMC_COOKIE cookie;
|
|
|
|
|
|
//
|
|
// Get the cookie of the scope pane item
|
|
//
|
|
|
|
hr = lpDataObject->QueryInterface(IID_IGPEDataObject, (LPVOID *)&pGPEDataObject);
|
|
|
|
if (FAILED(hr))
|
|
return S_OK;
|
|
|
|
hr = pGPEDataObject->GetCookie(&cookie);
|
|
|
|
pGPEDataObject->Release(); // release initial ref
|
|
|
|
if (FAILED(hr))
|
|
return S_OK;
|
|
|
|
ULONG ulNoChars = 50;
|
|
pszHelpTopic = (LPOLESTR) CoTaskMemAlloc (ulNoChars * sizeof(WCHAR));
|
|
|
|
if (pszHelpTopic)
|
|
{
|
|
hr = StringCchCopy (pszHelpTopic, ulNoChars, g_NameSpace[cookie].lpHelpTopic);
|
|
if (SUCCEEDED(hr))
|
|
{
|
|
m_pDisplayHelp->ShowTopic (pszHelpTopic);
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|
|
break;
|
|
|
|
default:
|
|
hr = E_UNEXPECTED;
|
|
break;
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
STDMETHODIMP CSnapIn::GetDisplayInfo(LPRESULTDATAITEM pResult)
|
|
{
|
|
if (pResult)
|
|
{
|
|
if (pResult->bScopeItem == TRUE)
|
|
{
|
|
if (pResult->mask & RDI_STR)
|
|
{
|
|
if (pResult->nCol == 0)
|
|
{
|
|
pResult->str = g_NameSpace[pResult->lParam].szDisplayName;
|
|
}
|
|
else
|
|
{
|
|
pResult->str = L"";
|
|
}
|
|
}
|
|
|
|
if (pResult->mask & RDI_IMAGE)
|
|
{
|
|
if (m_pcd->m_pGPO)
|
|
pResult->nImage = g_NameSpace[pResult->lParam].iIcon;
|
|
else
|
|
pResult->nImage = 3;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (pResult->mask & RDI_STR)
|
|
{
|
|
if (pResult->nCol == 0)
|
|
{
|
|
LPRESULTITEM lpResultItem = (LPRESULTITEM)pResult->lParam;
|
|
|
|
if (lpResultItem->szDisplayName[0] == TEXT('\0'))
|
|
{
|
|
LoadString (g_hInstance, lpResultItem->iStringID,
|
|
lpResultItem->szDisplayName,
|
|
MAX_DISPLAYNAME_SIZE);
|
|
}
|
|
|
|
pResult->str = lpResultItem->szDisplayName;
|
|
}
|
|
|
|
if (pResult->str == NULL)
|
|
pResult->str = (LPOLESTR)L"";
|
|
}
|
|
}
|
|
}
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
STDMETHODIMP CSnapIn::QueryDataObject(MMC_COOKIE cookie, DATA_OBJECT_TYPES type, LPDATAOBJECT *ppDataObject)
|
|
{
|
|
return m_pcd->QueryDataObject(cookie, type, ppDataObject);
|
|
}
|
|
|
|
|
|
STDMETHODIMP CSnapIn::GetResultViewType(MMC_COOKIE cookie, LPOLESTR *ppViewType,
|
|
long *pViewOptions)
|
|
{
|
|
return S_FALSE;
|
|
}
|
|
|
|
STDMETHODIMP CSnapIn::CompareObjects(LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB)
|
|
{
|
|
HRESULT hr = S_FALSE;
|
|
LPGPEDATAOBJECT pGPEDataObjectA, pGPEDataObjectB;
|
|
MMC_COOKIE cookie1, cookie2;
|
|
|
|
|
|
if (lpDataObjectA == NULL || lpDataObjectB == NULL)
|
|
return E_POINTER;
|
|
|
|
//
|
|
// QI for the private GPODataObject interface
|
|
//
|
|
|
|
if (FAILED(lpDataObjectA->QueryInterface(IID_IGPEDataObject,
|
|
(LPVOID *)&pGPEDataObjectA)))
|
|
{
|
|
return S_FALSE;
|
|
}
|
|
|
|
|
|
if (FAILED(lpDataObjectB->QueryInterface(IID_IGPEDataObject,
|
|
(LPVOID *)&pGPEDataObjectB)))
|
|
{
|
|
pGPEDataObjectA->Release();
|
|
return S_FALSE;
|
|
}
|
|
|
|
pGPEDataObjectA->GetCookie(&cookie1);
|
|
pGPEDataObjectB->GetCookie(&cookie2);
|
|
|
|
if (cookie1 == cookie2)
|
|
{
|
|
hr = S_OK;
|
|
}
|
|
|
|
|
|
pGPEDataObjectA->Release();
|
|
pGPEDataObjectB->Release();
|
|
|
|
return hr;
|
|
}
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
// //
|
|
// CSnapIn object implementation (IExtendContextMenu) //
|
|
// //
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
STDMETHODIMP CSnapIn::AddMenuItems(LPDATAOBJECT piDataObject,
|
|
LPCONTEXTMENUCALLBACK pCallback,
|
|
LONG *pInsertionAllowed)
|
|
{
|
|
return m_pcd->AddMenuItems (piDataObject, pCallback, pInsertionAllowed);
|
|
}
|
|
|
|
STDMETHODIMP CSnapIn::Command(LONG lCommandID, LPDATAOBJECT piDataObject)
|
|
{
|
|
|
|
return m_pcd->Command (lCommandID, piDataObject);
|
|
}
|