11

現在、NetBiosメソッドを使用しており、XPでも問題なく動作します。Vistaでの予備テストでは、これも機能することが示されていますが、注意点があります。たとえば、NetBIOSが存在する必要があり、私が読んでいることから、アダプターの順序は必ず変更されます。別の方法(SNMPExtensionQueryを使用)は、Vistaでは機能しないようです。

問題は、VistaマシンでローカルMACアドレスのリストを取得するための信頼できる方法を知っていますか?XPとの下位互換性はプラスです(多くの醜い#ifdefよりも1つの方法が必要です)。ありがとう!

4

6 に答える 6

21

これにより、コンピューターのすべての 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;

    }
}
于 2008-10-21T14:03:32.753 に答える
2

WMIServiceを使用できますか? ただし、Vista以前の時代には、マシンのMACアドレスを取得するために使用していました。

于 2008-10-21T13:44:26.147 に答える
0

GetAdaptersInfo() は公式のメソッドであり、切断されているものも含めてすべてのアダプターを列挙します。
サンプル コードcodeguruについては、この投稿を参照してください

于 2008-10-21T13:43:22.340 に答える
0
#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";
}
于 2015-12-03T19:22:50.477 に答える
-1

XP と Vista の両方で WMI を使用できます。オンラインに多数の例があります。例: Windows Management Instrumentation (WMI) を使用して MAC アドレスを取得する

于 2008-10-21T13:43:28.597 に答える