MACアドレスの取得というか、IPアドレスに始まるネットワークアダプタの情報を取得する方法です。
非常に簡単です。
ヘッダー「Iphlpapi.h」をインクルードして、ライブラリ「Iphlpapi.lib」をリンクすればOKです。
GetAdaptersInfo()関数で、各種NIC情報を取得できます。
構造体「PIP_ADAPTER_INFO」の情報をMSDNで調べれば他に取得できる情報がわかります。
早速サンプルです。
<Category : C/C++>
非常に簡単です。
ヘッダー「Iphlpapi.h」をインクルードして、ライブラリ「Iphlpapi.lib」をリンクすればOKです。
GetAdaptersInfo()関数で、各種NIC情報を取得できます。
構造体「PIP_ADAPTER_INFO」の情報をMSDNで調べれば他に取得できる情報がわかります。
早速サンプルです。
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
//macアドレス取得に必要
#include <Iphlpapi.h>
//必要ライブラリ Iphlpapi.lib
int WINAPI WinMain( HINSTANCE hInstance,
{
#include <stdio.h>
#include <tchar.h>
//macアドレス取得に必要
#include <Iphlpapi.h>
//必要ライブラリ Iphlpapi.lib
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
LPTSTR lpCmdLine,
int nCmdShow)
PIP_ADAPTER_INFO adapter_info = NULL;
PIP_ADAPTER_INFO adapter_info_temp;
ULONG adapter_info_size = 0;
DWORD ret;
DWORD len;
TCHAR *mac_address,*temp;
if(address_size == NULL){
//NICの各種情報を取得
ret = GetAdaptersInfo( NULL, &adapter_info_size );//構造体のサイズを取得する
if(ret == ERROR_BUFFER_OVERFLOW){
adapter_info_temp = adapter_info;//freeするためにポインタを保存
if(adapter_info_size == 0){
while (adapter_info != NULL) {
free(adapter_info_temp);
return 0;
}
PIP_ADAPTER_INFO adapter_info_temp;
ULONG adapter_info_size = 0;
DWORD ret;
DWORD len;
TCHAR *mac_address,*temp;
if(address_size == NULL){
return 0;
}//NICの各種情報を取得
ret = GetAdaptersInfo( NULL, &adapter_info_size );//構造体のサイズを取得する
if(ret == ERROR_BUFFER_OVERFLOW){
if(!(adapter_info = (PIP_ADAPTER_INFO)malloc(adapter_info_size))){
ret = GetAdaptersInfo( adapter_info, &adapter_info_size);//情報を取得
if(ret != ERROR_SUCCESS){
}else if(ret == ERROR_NO_DATA){
return 1;
}ret = GetAdaptersInfo( adapter_info, &adapter_info_size);//情報を取得
if(ret != ERROR_SUCCESS){
return 1;
}
return 1;
}else if(ret != ERROR_SUCCESS){
return 1;
}adapter_info_temp = adapter_info;//freeするためにポインタを保存
if(adapter_info_size == 0){
adapter_info = NULL;
}while (adapter_info != NULL) {
//ethernetアダプタ以外は除外する
if(adapter_info->Type != 6){
//IPとサブネットを表示
PIP_ADDR_STRING pAddressList = &(adapter_info->IpAddressList);
do {
//MACアドレスを表示
len = adapter_info->AddressLength * 3 + 1;
if((mac_address = new TCHAR[len]) != NULL){
adapter_info = adapter_info->Next;
}if(adapter_info->Type != 6){
adapter_info = adapter_info->Next;
continue;
}continue;
//IPとサブネットを表示
PIP_ADDR_STRING pAddressList = &(adapter_info->IpAddressList);
do {
_tprintf(TEXT("\t IP Address : %s\n"),pAddressList->IpAddress.String);
_tprintf(TEXT("\t Subnet Mask : %s\n"), pAddressList->IpMask.String);
pAddressList = pAddressList->Next;
}while(pAddressList != NULL);_tprintf(TEXT("\t Subnet Mask : %s\n"), pAddressList->IpMask.String);
pAddressList = pAddressList->Next;
//MACアドレスを表示
len = adapter_info->AddressLength * 3 + 1;
if((mac_address = new TCHAR[len]) != NULL){
//MACアドレスのデータを文字列に変換
temp = mac_address;
for(unsigned int i=0;i<adapter_info->AddressLength;i++){
_tprintf(TEXT("\t MAC Address : %s\n"),mac_address);
delete mac_address;
}temp = mac_address;
for(unsigned int i=0;i<adapter_info->AddressLength;i++){
temp += _stprintf(temp,!i ? TEXT("%02x") : TEXT("-%02x"),adapter_info->Address[i]);
}_tprintf(TEXT("\t MAC Address : %s\n"),mac_address);
delete mac_address;
adapter_info = adapter_info->Next;
free(adapter_info_temp);
return 0;