资源简介

网速流量监控 悬浮窗口

资源截图

代码片段和文件信息

#include “stdafx.h“
#include “MFNetTraffic.h“
#include “float.h“
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
#include “winperf.h“
MFNetTraffic::MFNetTraffic()
{
lasttraffic = 0.0;
CurrentInterface = -1;
CurrentTrafficType = AllTraffic;
GetInterfaces();
}
MFNetTraffic::~MFNetTraffic()
{

}
PERF_object_TYPE *Firstobject(PERF_DATA_BLOCK *dataBlock)
{
  return (PERF_object_TYPE *) ((BYTE *)dataBlock + dataBlock->HeaderLength);
}
PERF_object_TYPE *Nextobject(PERF_object_TYPE *act)
{
  return (PERF_object_TYPE *) ((BYTE *)act + act->TotalByteLength);
}
PERF_COUNTER_DEFINITION *FirstCounter(PERF_object_TYPE *perfobject)
{
  return (PERF_COUNTER_DEFINITION *) ((BYTE *) perfobject + perfobject->HeaderLength);
}
PERF_COUNTER_DEFINITION *NextCounter(PERF_COUNTER_DEFINITION *perfCounter)
{
  return (PERF_COUNTER_DEFINITION *) ((BYTE *) perfCounter + perfCounter->ByteLength);
}
PERF_COUNTER_BLOCK *GetCounterBlock(PERF_INSTANCE_DEFINITION *pInstance)
{
  return (PERF_COUNTER_BLOCK *) ((BYTE *)pInstance + pInstance->ByteLength);
}
PERF_INSTANCE_DEFINITION *FirstInstance (PERF_object_TYPE *pobject)
{
  return (PERF_INSTANCE_DEFINITION *)  ((BYTE *) pobject + pobject->DefinitionLength);
}
PERF_INSTANCE_DEFINITION *NextInstance (PERF_INSTANCE_DEFINITION *pInstance)
{
  PERF_COUNTER_BLOCK  *pCtrBlk = GetCounterBlock(pInstance);
  return (PERF_INSTANCE_DEFINITION *) ((BYTE *)pInstance + pInstance->ByteLength + pCtrBlk->ByteLength);
}
char *WideToMulti(wchar_t *source char *dest int size)
{
  WideCharToMultiByte(CP_ACP 0 source -1 dest size 0 0);
  return dest;
}



//得到接口号为interfaceNumber的接口流量
double MFNetTraffic::GetTraffic(int interfaceNumber)
{
try
{
#define DEFAULT_BUFFER_SIZE 40960L
POSITION pos;
CString InterfaceName;
pos = Interfaces.FindIndex(interfaceNumber);
if(pos==NULL)
return 0.0;
//得到当前的接口名字
InterfaceName = Interfaces.GetAt(pos);
//为性能数据缓冲
unsigned char *data = new unsigned char [DEFAULT_BUFFER_SIZE];
// 从RegQueryValueEx返回的值:本例中忽略改变量
DWORD type;
// 缓冲的尺寸
DWORD size = DEFAULT_BUFFER_SIZE;
// RegQueryValueEx返回的值
DWORD ret;
// 从网络对象(索引是510)查询性能数据
while((ret = RegQueryValueEx(
HKEY_PERFORMANCE_DATA “510“ NULL &type data &size)) != ERROR_SUCCESS) 
{
if(ret == ERROR_MORE_DATA) 
{
// 缓冲尺寸太小,增加内存分配
size += DEFAULT_BUFFER_SIZE;
delete [] data;
data = new unsigned char [size];

else 
{
// 未定义的错误
return 1;
}
}
//性能数据块
PERF_DATA_BLOCK *dataBlockPtr = (PERF_DATA_BLOCK *)data;
//枚举链表中第一个对象
PERF_object_TYPE *objectPtr = Firstobject(dataBlockPtr);
//遍历链表 
for(int a=0 ; a<(int)dataBlockPtr->NumobjectTypes ; a++) 
{
char nameBuffer[255];
// 判断是否是网络对象索引号是510
if(objectPtr->objectNametitleIndex == 510) 
{
// 偏移变量
DWORD processIdOffset = ULONG_MAX;
// 找到第一个计数器
PERF_COUN

评论

共有 条评论