Ответ 1
Не могли бы вы использовать WMIService? Я использовал его для получения MAC-адреса машины в дни до Vista.
В настоящее время мы используем метод NetBios, и он работает нормально под XP. Предварительные тесты в Vista показывают, что он также работает, но есть оговорки. NetBIOS должен присутствовать, например, и из того, что я читал, порядок адаптеров неизбежно изменится. Наш альтернативный метод - SNMPExtensionQuery - кажется, что он поврежден под Vista.
Вопрос: знаете ли вы о надежном способе получения списка локальных MAC-адресов на машине Vista? Обратная совместимость с XP - плюс (я бы предпочел иметь один единственный метод, чем много уродливых # ifdef). Спасибо!
Не могли бы вы использовать WMIService? Я использовал его для получения MAC-адреса машины в дни до Vista.
Это даст вам список всех MAC-адресов на вашем компьютере. Он также будет работать со всеми версиями Windows:
void getdMacAddresses(std::vector<std::string> &vMacAddresses;)
{
vMacAddresses.clear();
IP_ADAPTER_INFO AdapterInfo[32]; // Allocate information for up to 32 NICs
DWORD dwBufLen = sizeof(AdapterInfo); // Save memory size of buffer
DWORD dwStatus = GetAdaptersInfo( // Call GetAdapterInfo
AdapterInfo, // [out] buffer to receive data
&dwBufLen); // [in] size of receive data buffer
//No network card? Other error?
if(dwStatus != ERROR_SUCCESS)
return;
PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo;
char szBuffer[512];
while(pAdapterInfo)
{
if(pAdapterInfo->Type == MIB_IF_TYPE_ETHERNET)
{
sprintf_s(szBuffer, sizeof(szBuffer), "%.2x-%.2x-%.2x-%.2x-%.2x-%.2x"
, pAdapterInfo->Address[0]
, pAdapterInfo->Address[1]
, pAdapterInfo->Address[2]
, pAdapterInfo->Address[3]
, pAdapterInfo->Address[4]
, pAdapterInfo->Address[5]
);
vMacAddresses.push_back(szBuffer);
}
pAdapterInfo = pAdapterInfo->Next;
}
}
GetAdaptersInfo() является официальным методом, он перечисляет все адаптеры, даже отключенные.
См. Это сообщение, например, код codeguru
Вы можете использовать WMI как для XP, так и для Vista, есть несколько примеров онлайн. например: Используйте Инструмент управления Windows (WMI), чтобы получить MAC-адрес
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <stdio.h>
#include <vector>
#include <Windows.h>
#include <Iphlpapi.h>
#include <Assert.h>
#include <string>
#pragma comment(lib, "iphlpapi.lib")
char* getdMacAddresses()
{
IP_ADAPTER_INFO AdapterInfo[32]; // Allocate information for up to 32 NICs
DWORD dwBufLen = sizeof(AdapterInfo); // Save memory size of buffer
DWORD dwStatus = GetAdaptersInfo( // Call GetAdapterInfo
AdapterInfo, // [out] buffer to receive data
&dwBufLen); // [in] size of receive data buffer
//Exit When Error
if (dwStatus != ERROR_SUCCESS)
return "ERROR";
PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo;
char szBuffer[512];
while (pAdapterInfo)
{
if (pAdapterInfo->Type == MIB_IF_TYPE_ETHERNET)
{
sprintf_s(szBuffer, sizeof(szBuffer), "%.2x-%.2x-%.2x-%.2x-%.2x-%.2x"
, pAdapterInfo->Address[0]
, pAdapterInfo->Address[1]
, pAdapterInfo->Address[2]
, pAdapterInfo->Address[3]
, pAdapterInfo->Address[4]
, pAdapterInfo->Address[5]
);
return szBuffer;
}
pAdapterInfo = pAdapterInfo->Next;
}
return "ERROR";
}