#define DEFAULT_BUFFER_SIZE 40960L
double MFNetTraffic::GetTraffic(int interfaceNumber)
{
try
{
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];

DWORD type;

DWORD size = DEFAULT_BUFFER_SIZE;

DWORD ret; while((ret = RegQueryValueEx(
HKEY_PERFORMANCE_DATA, (LPCTSTR)"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_COUNTER_DEFINITION *counterPtr = FirstCounter(objectPtr);
// 遍历链表
for(int b=0 ; b<(int)objectPtr->NumCounters ; b++) 
{
// 判断接收的数据类型是否是我们需要的
if((int)counterPtr->CounterNameTitleIndex == CurrentTrafficType)
processIdOffset = counterPtr->CounterOffset; // 下一个计数器
counterPtr = NextCounter(counterPtr);
} //数据类型不是我们需要的
if(processIdOffset == ULONG_MAX) {
delete [] data;
return 1;
} // 找到第一个实列(instance)
PERF_INSTANCE_DEFINITION *instancePtr = FirstInstance(objectPtr); DWORD fullTraffic;
DWORD traffic;
//遍历整个实列
for(int b=0 ; b<objectPtr->NumInstances ; b++) 
{
wchar_t *namePtr = (wchar_t *) ((BYTE *)instancePtr + instancePtr->NameOffset);
// 得到这个实列的PERF_COUNTER_BLOCK
PERF_COUNTER_BLOCK *counterBlockPtr = GetCounterBlock(instancePtr); // 现在我们得到了接口的名字
char *pName = WideToMulti(namePtr, nameBuffer, sizeof(nameBuffer));
CString iName;
iName.Format(_T("%s"),pName); POSITION pos = TotalTraffics.FindIndex(b);
if(pos!=NULL)
{
fullTraffic = *((DWORD *) ((BYTE *)counterBlockPtr + processIdOffset));
TotalTraffics.SetAt(pos,fullTraffic);
} // 如果当前的接口就是我们选择的接口
if(InterfaceName == iName)
{
traffic = *((DWORD *) ((BYTE *)counterBlockPtr + processIdOffset));
double acttraffic = (double)traffic;
double trafficdelta;
// 判断处理的接口是否是新的
if(CurrentInterface != interfaceNumber)
{
lasttraffic = acttraffic;
trafficdelta = 0.0;
CurrentInterface = interfaceNumber;
}
else
{
trafficdelta = acttraffic - lasttraffic;
lasttraffic = acttraffic;
}
delete [] data;
return(trafficdelta);
} //下一个实列
instancePtr = NextInstance(instancePtr);
}
} // 下一个对象
objectPtr = NextObject(objectPtr);
} delete [] data;
return 0;
} catch(...)
{
return 0;
}
}这段代码在release版本下直接从CString InterfaceName 下跳到 objectPtr = NextObject(objectPtr);
中去了 中间一大段的代码 没执行 所以 就没有监控到数据 断点是提示 无效文件行 怎么回事?