mfc 获取网卡数目

int CGetSysInfo::GetInterFaceCount()
{
	try  
	{  
#define DEFAULT_BUFFER_SIZE 40960L  

		unsigned char *data = (unsigned char*)malloc(DEFAULT_BUFFER_SIZE);  
		DWORD type;  
		DWORD size = DEFAULT_BUFFER_SIZE;  
		DWORD ret;  

		char s_key[4096];  
		sprintf_s(s_key , 4096 , "510");  
		//RegQueryValueEx的固定调用格式          
		CString str(s_key);  

		//如果RegQueryValueEx函数执行失败则进入循环  
		while((ret = RegQueryValueEx(HKEY_PERFORMANCE_DATA, str, 0, &type, data, &size)) != ERROR_SUCCESS)  
		{  
			Sleep(10);  
			//如果RegQueryValueEx的返回值为ERROR_MORE_DATA(申请的内存区data太小,不能容纳RegQueryValueEx返回的数据)  
			if(ret == ERROR_MORE_DATA)   
			{  
				Sleep(10);  
				size += DEFAULT_BUFFER_SIZE;  
				data = (unsigned char*) realloc(data, size);//重新分配足够大的内存  

				ret = RegQueryValueEx(HKEY_PERFORMANCE_DATA, str, 0, &type, data, &size);//重新执行RegQueryValueEx函数  
			}   
			//如果RegQueryValueEx返回值仍旧未成功则函数返回.....(注意内存泄露“free函数”~~~)。  
			//这个if保证了这个while只能进入一次~~~避免死循环  
			if(ret != ERROR_SUCCESS)  
			{  
				if (NULL != data)  
				{  
					free(data);  
					data = NULL;  
				}  
				return 0;//0个接口  
			}  
		}  

		//函数执行成功之后就是对返回的data内存中数据的解析了,这个建议去查看MSDN有关RegQueryValueEx函数参数数据结构的说明  
		//得到数据块       
		PERF_DATA_BLOCK  *dataBlockPtr = (PERF_DATA_BLOCK *)data;  
		//得到第一个对象  
		PERF_OBJECT_TYPE *objectPtr = (PERF_OBJECT_TYPE *) ((BYTE *)dataBlockPtr + dataBlockPtr->HeaderLength);  

		for(int a=0 ; a<(int)dataBlockPtr->NumObjectTypes ; a++)   
		{  
			char nameBuffer[255] = {0};  
			if(objectPtr->ObjectNameTitleIndex == 510)   
			{  
				DWORD processIdOffset = ULONG_MAX;  
				PERF_COUNTER_DEFINITION *counterPtr =(PERF_COUNTER_DEFINITION *) ((BYTE *)objectPtr + objectPtr->HeaderLength);  

				for(int b=0 ; b<(int)objectPtr->NumCounters ; b++)   
				{  
					if(counterPtr->CounterNameTitleIndex == 520)  
						processIdOffset = counterPtr->CounterOffset;  

					counterPtr =(PERF_COUNTER_DEFINITION *) ((BYTE *) counterPtr + counterPtr->ByteLength);  
				}  

				if(processIdOffset == ULONG_MAX) {  
					if(data != NULL)  
					{  
						free(data);  
						data = NULL;  
					}  
					return 0;  
				}  

				PERF_INSTANCE_DEFINITION *instancePtr =(PERF_INSTANCE_DEFINITION *)  ((BYTE *) objectPtr + objectPtr->DefinitionLength);  

				for(int b=0 ; b<objectPtr->NumInstances ; b++)   
				{  
					wchar_t *namePtr = (wchar_t *) ((BYTE *)instancePtr + instancePtr->NameOffset);  
					PERF_COUNTER_BLOCK *counterBlockPtr = (PERF_COUNTER_BLOCK *) ((BYTE *)instancePtr + instancePtr->ByteLength);  

					char pName[256] = {0};  
					WideCharToMultiByte(CP_ACP, 0, namePtr, -1, pName, sizeof(nameBuffer), 0, 0);  

					DWORD bandwith = *((DWORD *) ((BYTE *)counterBlockPtr + processIdOffset));                
					DWORD tottraff = 0;  

					Interfaces.AddTail(CString(pName)); //各网卡的名称  
					Bandwidths.AddTail(bandwith);       //带宽  
					TotalTraffics.AddTail(tottraff);    // 流量初始化为0  

					PERF_COUNTER_BLOCK  *pCtrBlk = (PERF_COUNTER_BLOCK *) ((BYTE *)instancePtr + instancePtr->ByteLength);  


					instancePtr = (PERF_INSTANCE_DEFINITION *) ((BYTE *)instancePtr + instancePtr->ByteLength + pCtrBlk->ByteLength);  
				}  
			}  
			objectPtr = (PERF_OBJECT_TYPE *) ((BYTE *)objectPtr + objectPtr->TotalByteLength);  
		}  
		if(data != NULL)  
		{  
			free(data);  
			data = NULL;  
		}  
	}  
	catch(...)  
	{  
		return 0;  
	}  
	return Interfaces.GetCount();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RuningPigNO1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值