漫天飞舞
              -------个人杂感,记录个人所想、所感。
<2007年11月>
28293031123
45678910
11121314151617
18192021222324
2526272829301
2345678
公告
  • 本blog主要是记录个人的思想,供自己反省。因此谢绝人生攻击。

留言簿(323)

随笔分类

随笔档案

文章分类

文章档案

相册

叶飞之处

搜索

最新评论

阅读排行榜

评论排行榜

 
VC知识库BLOG   首页  新随笔  联系  聚合  登录 
  随笔-60 文章-52 评论-675 Trackbacks-0

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

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


#ifndef _XHJ_CHMONITOR_H_
#define _XHJ_CHMONITOR_H_
#include 
<windows.h>

template 
<class T>
class CHMonitor
{
public:
    CHMonitor():m_MemberFunction(
0),m_DelegaterHandle(0){};
    
virtual ~CHMonitor(){};

private:
    typedef  
void  (*DelegaterHandle)();
    typedef  
void  (T::*TMemberFunctionPointer)();
   
public:
    
//开始监测
    virtual int StartMonitor() = 0;

    
//停止监测
    virtual BOOL StopMonitor() = 0;

    
//挂起监测
    virtual BOOL SuspendMonitor() = 0;

    
//继续监测
    virtual BOOL ResumeMonitor() = 0;

    
virtual void SetCallBackHandle(DelegaterHandle handle) { m_DelegaterHandle = handle;}

    
virtual void SetCallbackFunction(T* host, TMemberFunctionPointer memberFunction)
    
{
        m_spHost 
= host;
        m_MemberFunction 
= memberFunction;
    }


    
    
virtual void InvokeHandle() 
    

        
if(m_DelegaterHandle)
            m_DelegaterHandle();
        
if(m_MemberFunction)
        
{
            ((static_cast
<T*>(m_spHost)->*m_MemberFunction)());
        }

    }


protected:

    DelegaterHandle m_DelegaterHandle;
    T
* m_spHost;
    TMemberFunctionPointer m_MemberFunction;
}
;

#endif

别看了.完了.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*)this00);
        
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) == 0xFFFFFFFFreturn FALSE;
        
return TRUE;
    }

    
//继续监测
    BOOL ResumeMonitor()
    
{
        
if(ResumeThread (m_ThreadHandle) == 0xFFFFFFFFreturn 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() == 0return -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