监测类的框架,使用了一个回调模式.可以回调普通函数和成员函数。
特别说明:该代码是我当时使用的,因为我使用的是成员函数,所以就使用了模版。但是这也带来了问题:如果用户仅仅使用普通函数作为回调的话,就很不方便。所以,如果想仅仅使用普通函数的话,需要把该类一分为二:把实现普通回调和成员回调分开。
特别鸣谢:[jzhang]、[hpho]两位朋友的建议和意见。
代码如下:
别看了.完了.cpp没有内容
别怕头晕,我来一个实现:

/**
* @file CHProcessMonitor.h
* @class CHProcessMonitor
* @author flyingleaf
* @version 1.0.0.0
* @date 2006-08-08
* @brief 您可以任使用此文件,但是需要保留本声明
*/

#ifndef _XHJ_CHWMIMONITOR_H_
#define _XHJ_CHWMIMONITOR_H_
#include "CHWmi.h"
#include "CHMonitor.h"
#include <string>
#include <CHMutex.h>

using namespace std;
using namespace XHJ;


template <class T>
class CHProcessMonitor : public CHMonitor<T>


{
public:
CHProcessMonitor()

{
}
//参数分别是IP,用户名,密码,wql语句。
//如果是本机,则ip为127.0.0.1,用户名和密码都可以为空。
CHProcessMonitor(const char* wql,const char* ip = "127.0.0.1",
const char* username = "", const char* psw="" )

{
m_Wql = wql;
m_IP = ip;
m_UserName = username;
m_Psw = psw;
m_EventHandle = NULL;
m_ThreadHandle = NULL;
}
~CHProcessMonitor()

{
}
public:
//开始监测
int StartMonitor()

{
m_EventHandle = CreateEvent(NULL,FALSE,FALSE,"XHJ_CHProcessMonitor_Event");
if(m_EventHandle == NULL)

{
return -3;
}
m_ThreadHandle = CreateThread(NULL, 0, ThreadFuncNotify, (void*)this, 0, 0);
if(m_ThreadHandle == NULL)

{
return -4;
}
return 0;
}
//停止监测
BOOL StopMonitor()

{
Lock lock(m_Mutex);
SetEvent(m_EventHandle);
return TRUE;
}
//挂起监测
BOOL SuspendMonitor()

{
if(SuspendThread(m_ThreadHandle) == 0xFFFFFFFF) return FALSE;
return TRUE;
}
//继续监测
BOOL ResumeMonitor()

{
if(ResumeThread (m_ThreadHandle) == 0xFFFFFFFF) return FALSE;
return TRUE;
}

const char* GetUserName() const
{ return m_UserName.c_str();}

const char* GetIP() const
{ return m_IP.c_str(); }

const char* GetPsw() const
{ return m_Psw.c_str(); }

const char* GetWql() const
{ return m_Wql.c_str(); }

void SetIP(const char* ip)
{ m_IP = ip; }

void SetUserName(const char* username)
{ m_UserName = username;}

void SetPsw(const char* psw)
{ m_Psw = psw;}

void SetWql(const char* wql)
{ m_Wql = wql; }
protected:
//监测线程
static DWORD WINAPI ThreadFuncNotify( LPVOID lpParam )

{
CHProcessMonitor* monitor = (CHProcessMonitor*)lpParam;
IEnumWbemClassObject* m_pEnum = NULL;
if(monitor->m_Wql.length() == 0) return -7;
CHWMI* m_CHWMIHandle = new CHWMI;
if(m_CHWMIHandle == NULL) return -1;
int ret = m_CHWMIHandle->Connect(monitor->m_IP,monitor->m_UserName, monitor->m_Psw);
if(ret != CWMI_RET_OK)

{
delete m_CHWMIHandle;
return -2;
}
IWbemClassObject* pObject = NULL;
ret = m_CHWMIHandle->WMINotificationQuery(monitor->m_Wql, &m_pEnum,&pObject);
if(ret != CWMI_RET_OK)

{
if(pObject)
pObject->Release();
delete m_CHWMIHandle;
return -3;
}

while(WaitForSingleObject(monitor->m_EventHandle, 0) != WAIT_OBJECT_0)

{
ret = m_CHWMIHandle->EnumInstanceNext(m_pEnum,
&pObject,500);
if(ret == CWMI_RET_OK)

{
monitor->InvokeHandle();
if(pObject)
pObject->Release();
pObject = NULL;
}
}
m_CHWMIHandle->EnumInstanceEnd(m_pEnum);
if(pObject)
pObject->Release();
if(m_CHWMIHandle)
delete m_CHWMIHandle;
return 0;
}
private:
string m_Wql;
string m_IP;
string m_UserName;
string m_Psw;
HANDLE m_EventHandle;
HANDLE m_ThreadHandle;
CHWMI* m_CHWMIHandle;
CHMutex m_Mutex;
IEnumWbemClassObject* m_pEnum;
};
#endif 附带wmi的简单封装

/**//**
* @file CHWMI.h
* @class CHWMI
* @author flyingleaf
* @version 1.0.0.0
* @date 2005-05-09
* @brief 您可以任使用此文件,但是需要保留本声明
*/

#ifndef _XHJ_CHWMI_H_
#define _XHJ_CHWMI_H_

// 如果您必须使用下列所指定的平台之前的平台,则修改下面的定义。
// 有关不同平台的相应值的最新信息,请参考 MSDN。
#ifndef WINVER // 允许使用 Windows 95 和 Windows NT 4 或更高版本的特定功能。
#define WINVER 0x0400 //为 Windows98 和 Windows 2000 及更新版本改变为适当的值。
#endif

#ifndef _WIN32_WINNT // 允许使用 Windows NT 4 或更高版本的特定功能。
#define _WIN32_WINNT 0x0400 //为 Windows98 和 Windows 2000 及更新版本改变为适当的值。
#endif

#ifndef _WIN32_WINDOWS // 允许使用 Windows 98 或更高版本的特定功能。
#define _WIN32_WINDOWS 0x0410 //为 Windows Me 及更新版本改变为适当的值。
#endif

#ifndef _WIN32_IE // 允许使用 IE 4.0 或更高版本的特定功能。
#define _WIN32_IE 0x0400 //为 IE 5.0 及更新版本改变为适当的值。
#endif

#include <Atlbase.h>
#include <Wbemidl.h>
#include <string>


#define CWMI_RET_OK 0
#define CWMI_RET_ERROR -1
#define CWMI_RET_ERROR_HRESULT -2
#define CWMI_RET_ERROR_DEFINE -3
#define CWMI_RET_TIMEOUT -4

#define CWMI_ENUM_CREAT 1
#define CWMI_ENUM_QUERY 2
