資源簡介
網速流量監控 懸浮窗口
代碼片段和文件信息
#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
評論
共有 條評論