如何从Win32_Networkadapter配置获取IP地址(Ps:如何获得流量) [英] How Do I Get Ip Address From Win32_Networkadapterconfiguration (Ps: How Do I Get Rate Of Flow)
本文介绍了如何从Win32_Networkadapter配置获取IP地址(Ps:如何获得流量)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
#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;
}
推荐答案
NETAddress是一个safearray而不是字符串,因为适配器可以有多个IP地址。
扫描安全数组以提取每个值。
使用SafeArrayAccessData获取数组指针。
此代码构建一个字符串连接所有找到的IP地址:
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:
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:
wprintf(L"Name: %-60s MAC: %-20s IP: %-20s\n", Name.bstrVal, MACAddress.bstrVal, NETAddress.bstrVal);
使用:
With:
wprintf(L"Name: %-60s MAC: %-20s IP: %-20s\n", Name.bstrVal, MACAddress.bstrVal, ConvertArrayToString(NETAddress, L" - "));
PS感谢downvote的任何人......
P.S. Thanks to whoever for the downvote...
这篇关于如何从Win32_Networkadapter配置获取IP地址(Ps:如何获得流量)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文