Click here to Skip to main content
15,885,435 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
C++
#include <stdio.h> 
#include <stdlib.h>
#include <tchar.h> 
#include <string.h>
#include <windows.h> 
#include <comdef.h>
#include <wbemidl.h> 
#pragma comment(lib,"wbemuuid.lib")

BOOL NetCardAddr()
{
	HRESULT Hresult;

	Hresult = CoInitializeEx(0, COINIT_MULTITHREADED);
	if (FAILED(Hresult))
	{
		return FALSE;
	}

	Hresult = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE, NULL);
	if (FAILED(Hresult))
	{
		CoUninitialize();
		return FALSE;
	}

	IWbemLocator *WbemLoc = NULL;
	Hresult = CoCreateInstance(CLSID_WbemLocator, 0, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *)&WbemLoc);
	if (FAILED(Hresult))
	{
		CoUninitialize();
		return FALSE;
	}

	IWbemServices *WbemSvc = NULL;
	Hresult = WbemLoc->ConnectServer(_bstr_t(L"ROOT\\CIMV2"), NULL, NULL, 0, NULL, 0, 0, &WbemSvc);
	if (FAILED(Hresult))
	{
		WbemLoc->Release();
		CoUninitialize();
		return FALSE;
	}

	Hresult = CoSetProxyBlanket(WbemSvc, RPC_C_AUTHN_WINNT, RPC_C_AUTHZ_NONE, NULL, RPC_C_AUTHN_LEVEL_CALL, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, EOAC_NONE);
	if (FAILED(Hresult))
	{
		WbemSvc->Release();
		WbemLoc->Release();
		CoUninitialize();
		return FALSE;
	}

	IEnumWbemClassObject *EnumObj = NULL;
	Hresult = WbemSvc->ExecQuery(bstr_t("WQL"), bstr_t("SELECT * FROM Win32_NetworkAdapterConfiguration where macaddress <> null"), WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY, NULL, &EnumObj);
	if (FAILED(Hresult))
	{
		printf("Exec WMI Failed\n");
		WbemSvc->Release();
		WbemLoc->Release();
		CoUninitialize();
		return FALSE;
	}

	int nTemperature = 0;
	int nTotalTime = 0;

	IWbemClassObject *pclsObj;
	ULONG uReturn = 0;

	while (EnumObj)
	{
		HRESULT hr = EnumObj->Next(WBEM_INFINITE, 1, 
			&pclsObj, &uReturn);

		if(0 == uReturn)
		{
			break;
		}

		VARIANT Name;
		VARIANT MACAddress;
		VARIANT NETAddress;

		VariantInit(&Name);
		VariantInit(&MACAddress);
		VariantInit(&NETAddress);

		// Get the value of the VendorSpecific property
		hr = pclsObj->Get(L"Description", 0, &Name, 0, 0);
		hr = pclsObj->Get(L"MACAddress", 0, &MACAddress, 0, 0);
		hr = pclsObj->Get(L"IPAddress", 0, &NETAddress, 0, 0);

		wprintf(L"Name: %-60s   MAC: %-20s IP: %-20s\n", Name.bstrVal, MACAddress.bstrVal, NETAddress.bstrVal); 

		VariantClear(&Name);
		VariantClear(&MACAddress);
		VariantClear(&NETAddress);
	}

	if (pclsObj != NULL) pclsObj->Release();
	EnumObj->Release();
	WbemSvc->Release();
	WbemLoc->Release();
	CoUninitialize();
	return TRUE;
}

VOID main( VOID )
{
	NetCardAddr();
	return;
}
Posted

1 solution

NETAddress is a safearray not a string because an adapter can have multiple IP addresses.
Scan the safe array to extract each value.
Use SafeArrayAccessData to get the array pointer.
This code build a string concatenating all ip addresses found:
C++
std::wstring ConvertArrayToString(VARIANT varArr, WCHAR* lpSeparator)
{
	std::wstring		strRet;

	if((VT_ARRAY|VT_BSTR) != varArr.vt)
		return L"";

	BSTR*	arr	= NULL;
	LONG	nLbound	= 0;
	LONG	nUBound = 0;

	SafeArrayGetLBound(varArr.parray, 1, &nLbound);
	SafeArrayGetUBound(varArr.parray, 1, &nUBound);
	SafeArrayAccessData(varArr.parray, (void **)&arr);
	for(int i = 0; i < (nUBound - nLbound + 1); i++)
	{
		if(0 != i)
			strRet += lpSeparator;
		strRet += std::wstring(arr[i]);
	}
	SafeArrayUnaccessData(varArr.parray);

	return strRet;
}

In your code replace:
C++
wprintf(L"Name: %-60s   MAC: %-20s IP: %-20s\n", Name.bstrVal, MACAddress.bstrVal, NETAddress.bstrVal); 

With:
C++
wprintf(L"Name: %-60s   MAC: %-20s IP: %-20s\n", Name.bstrVal, MACAddress.bstrVal, ConvertArrayToString(NETAddress, L" - "));


P.S. Thanks to whoever for the downvote...
 
Share this answer
 
v6
Comments
Member 10258940 10-Mar-15 2:36am    
thank you for your help ^_^
Frankie-C 10-Mar-15 4:58am    
You're welcome.
I've not understood what you mean for rate of flow?
Member 10258940 11-Mar-15 5:36am    
it mean NetCard UPLOAD Speed and Download Speed....do i need to write a ndis or wfp Driver to attach NetCard ?

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900