1、头文件
// Temporary.h
//
#ifndef _TEMPORARY_H_
#define _TEMPORARY_H_
#include <vector>
class CTemporary
{
public:
CTemporary() {};
BOOL GetMacAddress(std::vector<CString>& vtMacAddress);
private:
BOOL _IsPhysicalAdapter(const CString& sAdapterName);
};
#endif //!_TEMPORARY_H_
2、源文件
#include "Temporary.h"
#include <Iphlpapi.h>
#pragma comment(lib, "Iphlpapi.lib")
BOOL CTemporary::GetMacAddress(std::vector<CString>& vtMacAddress)
{
ULONG unAddrBuffSize = 0;
ULONG unResult = GetAdaptersAddresses(AF_UNSPEC,
GAA_FLAG_SKIP_ANYCAST, NULL, NULL, &unAddrBuffSize);
if (ERROR_BUFFER_OVERFLOW != unResult)
{
return FALSE;
}
PIP_ADAPTER_ADDRESSES pAdapterSet =
(PIP_ADAPTER_ADDRESSES)new BYTE[unAddrBuffSize];
ZeroMemory(pAdapterSet, unAddrBuffSize);
if (ERROR_SUCCESS != GetAdaptersAddresses(AF_UNSPEC,
GAA_FLAG_SKIP_ANYCAST, NULL, pAdapterSet, &unAddrBuffSize))
{
delete[]pAdapterSet;
return FALSE;
}
CString sTmp(_T(""));
PIP_ADAPTER_ADDRESSES pIndex = pAdapterSet;
while (pIndex)
{
PIP_ADAPTER_ADDRESSES pAdapter = pIndex;
pIndex = pIndex->Next;
sTmp = ATL::CA2T(pAdapter->AdapterName);
if (FALSE == _IsPhysicalAdapter(sTmp))
{
continue;
}
sTmp.Format(_T("%.2X-%.2X-%.2X-%.2X-%.2X-%.2X"),
pAdapter->PhysicalAddress[0], pAdapter->PhysicalAddress[1],
pAdapter->PhysicalAddress[2], pAdapter->PhysicalAddress[3],
pAdapter->PhysicalAddress[4], pAdapter->PhysicalAddress[5]);
vtMacAddress.push_back(sTmp);
}
delete[]pAdapterSet;
return TRUE;
}
BOOL CTemporary::_IsPhysicalAdapter(const CString& sAdapterName)
{
CString sKey(_T(""));
sKey.Format(_T("SYSTEM\\CurrentControlSet\\Control\\Network\\{4D36E972-E325-11CE-BFC1-08002BE10318}\\%s\\Connection"),
sAdapterName);
BOOL bResult = FALSE;
ATL::CRegKey regKey;
ULONG unKeyLen = 0;
PTSTR pKeyValue = NULL;
do
{
if (ERROR_SUCCESS != regKey.Create(HKEY_LOCAL_MACHINE, sKey))
{
break;
}
regKey.QueryStringValue(_T("PnPInstanceId"), pKeyValue, &unKeyLen);
if (0 == unKeyLen)
{
break;
}
pKeyValue = new TCHAR[unKeyLen];
ZeroMemory(pKeyValue, sizeof(TCHAR)*(unKeyLen));
if (ERROR_SUCCESS != regKey.QueryStringValue(
_T("PnPInstanceId"), pKeyValue, &unKeyLen))
{
break;
}
if (0 != _tcsncmp(pKeyValue, _T("PCI\\"), 4))
{
break;
}
bResult = TRUE;
} while (FALSE);
if (pKeyValue)
{
delete[]pKeyValue;
}
return bResult;
}
3、测试与样例
环境:Win8.1+VS2015
#include "Temporary.h"
#include <stdio.h>
int _tmain(int argc, _TCHAR* argv[])
{
std::vector<CString> vtMacAddress;
CTemporary temporary;
temporary.GetMacAddress(vtMacAddress);
for (UINT iIndex = 0; iIndex < vtMacAddress.size(); iIndex++)
{
_tprintf(_T("%s\n"), vtMacAddress[iIndex]);
}
system("PAUSE");
return 0;
}