GetAdaptersInfo 関数 (iphlpapi.h)

GetAdaptersInfo 関数は、ローカル コンピューターのアダプター情報を取得します。

Windows XP 以降の場合: GetAdaptersInfo の代わりに GetAdaptersAddresses 関数を使用します

構文

IPHLPAPI_DLL_LINKAGE ULONG GetAdaptersInfo(
  [out]     PIP_ADAPTER_INFO AdapterInfo,
  [in, out] PULONG           SizePointer
);

パラメーター

[out] AdapterInfo

IP_ADAPTER_INFO構造体のリンクされたリストを受け取るバッファーへのポインター。

[in, out] SizePointer

pAdapterInfo パラメーターによって指されるバッファーのサイズを指定する ULONG 変数へのポインター。 このサイズがアダプター情報を保持するのに十分でない場合、 GetAdaptersInfo はこの変数に必要なサイズを入力し、 ERROR_BUFFER_OVERFLOWのエラー コードを返します。

戻り値

関数が成功した場合、戻り値は ERROR_SUCCESS されます ( NO_ERRORと同じ値に定義されます)。

関数が失敗した場合、戻り値は次のいずれかのエラー コードになります。

リターン コード 説明
ERROR_BUFFER_OVERFLOW
アダプター情報を受信するバッファーが小さすぎます。 この値は、 pOutBufLen パラメーターによって示されるバッファー サイズが小さすぎてアダプター情報を保持できなかった場合、または pAdapterInfo パラメーターが NULL ポインターであった場合に返されます。 このエラー コードが返されると、 pOutBufLen パラメーターは必要なバッファー サイズを指します。
ERROR_INVALID_DATA
無効なアダプター情報が取得されました。
ERROR_INVALID_PARAMETER
いずれかのパラメーターが無効です。 このエラーは、 pOutBufLen パラメーターが NULL ポインターであるか、呼び出し元プロセスが pOutBufLen が指すメモリへの読み取り/書き込みアクセス権がない場合、または呼び出し元プロセスが pAdapterInfo パラメーターが指すメモリへの書き込みアクセス権がない場合に返されます。
ERROR_NO_DATA
ローカル コンピューターのアダプター情報が存在しません。
ERROR_NOT_SUPPORTED
GetAdaptersInfo 関数は、ローカル コンピューターで実行されているオペレーティング システムではサポートされていません。
その他
関数が失敗した場合は、 FormatMessage を使用して、返されたエラーのメッセージ文字列を取得します。

解説

GetAdaptersInfo 関数は、IPv4 アドレスの情報のみを取得できます。

Windows 10より前のバージョンでは、この関数によって返される一覧にアダプターが表示される順序は、[ネットワーク接続] フォルダーから制御できます。[詳細設定] メニュー項目を [詳細設定] メニュー項目から選択します。 Windows 10以降、順序は指定されていません。

GetAdaptersInfo 関数と GetInterfaceInfo 関数は、IPv4 ループバック インターフェイスに関する情報を返しません。 ループバック インターフェイスに関する情報は、 GetIpAddrTable 関数によって返されます。

Windows XP 以降の場合: GetAdaptersInfo によって返されるアダプターの一覧には、一方向のアダプターが含まれています。 データの送受信の両方が可能なアダプターの一覧を生成するには、 GetUniDirectionalAdapterInfo を呼び出し、返されたアダプターを GetAdaptersInfo によって返されるリストから除外します。

次の使用例は、アダプター情報を取得し、各アダプターのさまざまなプロパティを出力します。

#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <stdlib.h>
#pragma comment(lib, "IPHLPAPI.lib")

#define MALLOC(x) HeapAlloc(GetProcessHeap(), 0, (x))
#define FREE(x) HeapFree(GetProcessHeap(), 0, (x))

/* Note: could also use malloc() and free() */

int __cdecl main()
{

    /* Declare and initialize variables */

// It is possible for an adapter to have multiple
// IPv4 addresses, gateways, and secondary WINS servers
// assigned to the adapter. 
//
// Note that this sample code only prints out the 
// first entry for the IP address/mask, and gateway, and
// the primary and secondary WINS server for each adapter. 

    PIP_ADAPTER_INFO pAdapterInfo;
    PIP_ADAPTER_INFO pAdapter = NULL;
    DWORD dwRetVal = 0;
    UINT i;

/* variables used to print DHCP time info */
    struct tm newtime;
    char buffer[32];
    errno_t error;

    ULONG ulOutBufLen = sizeof (IP_ADAPTER_INFO);
    pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(sizeof (IP_ADAPTER_INFO));
    if (pAdapterInfo == NULL) {
        printf("Error allocating memory needed to call GetAdaptersinfo\n");
        return 1;
    }
// Make an initial call to GetAdaptersInfo to get
// the necessary size into the ulOutBufLen variable
    if (GetAdaptersInfo(pAdapterInfo, &ulOutBufLen) == ERROR_BUFFER_OVERFLOW) {
        FREE(pAdapterInfo);
        pAdapterInfo = (IP_ADAPTER_INFO *) MALLOC(ulOutBufLen);
        if (pAdapterInfo == NULL) {
            printf("Error allocating memory needed to call GetAdaptersinfo\n");
            return 1;
        }
    }

    if ((dwRetVal = GetAdaptersInfo(pAdapterInfo, &ulOutBufLen)) == NO_ERROR) {
        pAdapter = pAdapterInfo;
        while (pAdapter) {
            printf("\tComboIndex: \t%d\n", pAdapter->ComboIndex);
            printf("\tAdapter Name: \t%s\n", pAdapter->AdapterName);
            printf("\tAdapter Desc: \t%s\n", pAdapter->Description);
            printf("\tAdapter Addr: \t");
            for (i = 0; i < pAdapter->AddressLength; i++) {
                if (i == (pAdapter->AddressLength - 1))
                    printf("%.2X\n", (int) pAdapter->Address[i]);
                else
                    printf("%.2X-", (int) pAdapter->Address[i]);
            }
            printf("\tIndex: \t%d\n", pAdapter->Index);
            printf("\tType: \t");
            switch (pAdapter->Type) {
            case MIB_IF_TYPE_OTHER:
                printf("Other\n");
                break;
            case MIB_IF_TYPE_ETHERNET:
                printf("Ethernet\n");
                break;
            case MIB_IF_TYPE_TOKENRING:
                printf("Token Ring\n");
                break;
            case MIB_IF_TYPE_FDDI:
                printf("FDDI\n");
                break;
            case MIB_IF_TYPE_PPP:
                printf("PPP\n");
                break;
            case MIB_IF_TYPE_LOOPBACK:
                printf("Loopback\n");
                break;
            case MIB_IF_TYPE_SLIP:
                printf("Slip\n");
                break;
            default:
                printf("Unknown type %ld\n", pAdapter->Type);
                break;
            }

            printf("\tIP Address: \t%s\n",
                   pAdapter->IpAddressList.IpAddress.String);
            printf("\tIP Mask: \t%s\n", pAdapter->IpAddressList.IpMask.String);

            printf("\tGateway: \t%s\n", pAdapter->GatewayList.IpAddress.String);
            printf("\t***\n");

            if (pAdapter->DhcpEnabled) {
                printf("\tDHCP Enabled: Yes\n");
                printf("\t  DHCP Server: \t%s\n",
                       pAdapter->DhcpServer.IpAddress.String);

                printf("\t  Lease Obtained: ");
                /* Display local time */
                error = _localtime32_s(&newtime, (__time32_t*) &pAdapter->LeaseObtained);
                if (error)
                    printf("Invalid Argument to _localtime32_s\n");
                else {
                    // Convert to an ASCII representation 
                    error = asctime_s(buffer, 32, &newtime);
                    if (error)
                        printf("Invalid Argument to asctime_s\n");
                    else
                        /* asctime_s returns the string terminated by \n\0 */
                        printf("%s", buffer);
                }

                printf("\t  Lease Expires:  ");
                error = _localtime32_s(&newtime, (__time32_t*) &pAdapter->LeaseExpires);
                if (error)
                    printf("Invalid Argument to _localtime32_s\n");
                else {
                    // Convert to an ASCII representation 
                    error = asctime_s(buffer, 32, &newtime);
                    if (error)
                        printf("Invalid Argument to asctime_s\n");
                    else
                        /* asctime_s returns the string terminated by \n\0 */
                        printf("%s", buffer);
                }
            } else
                printf("\tDHCP Enabled: No\n");

            if (pAdapter->HaveWins) {
                printf("\tHave Wins: Yes\n");
                printf("\t  Primary Wins Server:    %s\n",
                       pAdapter->PrimaryWinsServer.IpAddress.String);
                printf("\t  Secondary Wins Server:  %s\n",
                       pAdapter->SecondaryWinsServer.IpAddress.String);
            } else
                printf("\tHave Wins: No\n");
            pAdapter = pAdapter->Next;
            printf("\n");
        }
    } else {
        printf("GetAdaptersInfo failed with error: %d\n", dwRetVal);

    }
    if (pAdapterInfo)
        FREE(pAdapterInfo);

    return 0;
}

要件

   
サポートされている最小のクライアント Windows 2000 Professional [デスクトップ アプリのみ]
サポートされている最小のサーバー Windows 2000 Server [デスクトップ アプリのみ]
対象プラットフォーム Windows
ヘッダー iphlpapi.h
Library Iphlpapi.lib
[DLL] Iphlpapi.dll

関連項目

GetAdaptersAddresses

GetInterfaceInfo

GetIpAddrTable

GetNumberOfInterfaces

GetUniDirectionalAdapterInfo

IP ヘルパー関数リファレンス

IP ヘルパーの開始ページ

IP_ADAPTER_INFO