📄 allusernode.h
字号:
#ifndef __AllUserNODE_H__
#define __AllUserNODE_H__
#include "UserNode.h"
class CAllUserNode : public CBaseNodeItem<CAllUserNode>
{
std::vector<CUserNode*> m_vecItems;
public:
CAllUserNode():m_threadId(0), m_thread(NULL),
m_running(false), m_bViewUpdated(false)
{
memset(&m_scopeDataItem, 0, sizeof(SCOPEDATAITEM));
m_scopeDataItem.mask = SDI_STR | SDI_IMAGE | SDI_OPENIMAGE | SDI_PARAM | SDI_CHILDREN;
m_scopeDataItem.displayname = MMC_CALLBACK;
m_scopeDataItem.nImage = 0;
m_scopeDataItem.nOpenImage = 1;
m_scopeDataItem.lParam = (LPARAM) this;
memset(&m_resultDataItem, 0, sizeof(RESULTDATAITEM));
//初始化临界区变量
InitializeCriticalSection(&m_critSect);
//InitChildren();
}
~CAllUserNode()
{ //停止线程
StopThread();
//删除子节点对象
for(int i=0; i<m_vecItems.size(); i++)
delete m_vecItems[i];
//删除临界区变量
DeleteCriticalSection(&m_critSect);
}
//该节点的结果视图类型为默认类型
STDMETHOD(GetResultViewType)(LPOLESTR *ppViewType,long *pViewOptions)
{
*ppViewType = NULL;
*pViewOptions = MMC_VIEW_OPTIONS_NONE;
return S_FALSE;
}
STDMETHOD(QueryPagesFor)(DATA_OBJECT_TYPES type)
{
if (type == CCT_SCOPE || type == CCT_RESULT)
return S_OK;
return S_FALSE;
}
//当选择该节点时,可以添加一些相关的命令菜单,
//在此因不需要,所以为未添加任何菜单
HRESULT OnSelect(IConsole *spConsole, IComponent* pComponent)
{
IConsoleVerb *pConsoleVerb;
HRESULT hr = spConsole->QueryConsoleVerb(&pConsoleVerb);
_ASSERT(SUCCEEDED(hr));
//hr = pConsoleVerb->SetVerbState(MMC_VERB_REFRESH, ENABLED, TRUE);
//_ASSERT(SUCCEEDED(hr));
//hr = pConsoleVerb->SetVerbState(MMC_VERB_PROPERTIES, ENABLED, TRUE);
//_ASSERT(SUCCEEDED(hr));
pConsoleVerb->Release();
return S_OK;
}
//提供该节点显示在结果视图中时的数据
LPOLESTR GetResultPaneColInfo(int nCol)
{
switch (nCol)
{
case 0:
return m_bstrDisplayName;
}
return OLESTR("Override GetResultPaneColInfo");
}
//当MMC需要显示该节点信息时,在结果视图中初始化标题头
HRESULT OnShow(IConsole *pConsole, BOOL bShow)
{
HRESULT hr = S_FALSE;
if(bShow)
{
CComQIPtr<IResultData, &IID_IResultData> spResultData(pConsole);
CComQIPtr<IHeaderCtrl, &IID_IHeaderCtrl> spHeaderCtrl(pConsole);
//spResultData->SetDescBarText(OLESTR("Bleh"));
//spResultData->SetViewMode(LVS_LIST);
HRESULT hr = spResultData->DeleteAllRsltItems();
/*
CComPtr<IDataObject, &IID_IDataObject> spDataObject;
GetDataObject(&spDataObject, CCT_SCOPE);
pConsole->UpdateAllViews(spDataObject, 0, 0);
*/
hr = spHeaderCtrl->InsertColumn( 0, L"用户名", 0, MMCLV_AUTO);
_ASSERT( SUCCEEDED(hr) );
hr = spHeaderCtrl->InsertColumn( 1, L"所属的组", 0, MMCLV_AUTO);
_ASSERT( SUCCEEDED(hr) );
hr = spHeaderCtrl->InsertColumn( 2, L"全名", 0, MMCLV_AUTO);
_ASSERT( SUCCEEDED(hr) );
hr = spHeaderCtrl->InsertColumn( 3, L"描述", 0, MMCLV_AUTO);
_ASSERT( SUCCEEDED(hr) );
hr = spHeaderCtrl->InsertColumn( 4, L"全局标识(GUID)", 0, MMCLV_AUTO);
_ASSERT( SUCCEEDED(hr) );
}
return S_FALSE;
}
HRESULT OnExpand(BOOL bExpand, IConsole *pConsole, HSCOPEITEM parent);
private:
//停止线程
void StopThread();
//启动线程
void StartThread();
//线程主过程
static DWORD WINAPI ThreadProc(
LPVOID lpParameter // thread data
);
//保存该指针,便于线程使用,插入子节点时需要
//控制台名字空间对象,插入子节点需要调用其方法
IConsoleNameSpace *m_pConsoleNameSpace;
//父节点句柄
HSCOPEITEM m_scopeitem;
//保存新产生的线程的ID值
DWORD m_threadId;
//线程句柄
HANDLE m_thread;
//线程是否正在运行
bool m_running;
//数据是否被刷新
bool m_bViewUpdated;
//临届区
CRITICAL_SECTION m_critSect;
//初始化子节点,该过程可能需要比较长的时间
BOOL InitChildren();
}
#endif //__AllUserNODE_H__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -