novaの日記: NIC 情報
BCB6 で ホスト名、ユーザ名、IP アドレス、MAC アドレスを取得する方法
ほとんど API に頼りっぱなしなんで BCB6 はアンマリ関係無いような気もしますが。
----- Unit1.h --------------------------------------------------------------------------------------
#include <stdio.h>
#include <winsock2.h>
//[インストールしたディレクトリ]\Borland\CBuilder6\Lib\Psdk\iphlpapi.lib をプロジェクトに追加しておくこと。
#include <iphlpapi.h>
#define MAXSTRING 512
----------------------------------------------------------------------------------------------------
----- Unit1.cpp ------------------------------------------------------------------------------------
void __fastcall TmainForm::FormCreate(TObject *Sender)
{
//window のタイトル部分に「ホスト名」「ユーザ名」「IP アドレス」「MAC アドレス」を表示。
AnsiString hostName;
AnsiString userName;
AnsiString ipAdd;
AnsiString macAdd;
int ret;
Get_HostName(hostName);
Get_UserName(userName);
Get_IpAddress(ipAdd);
ret = Get_MacAddress(macAdd);
mainForm->Caption = "HOST [" + hostName + "] / USER [ " + userName + " ] / IP [" + ipAdd + "] / MAC [" + macAdd + "]";
}
//---------------------------------------------------------------------------
void __fastcall TmainForm::Get_HostName(AnsiString &hostName)
{
char buf[MAX_COMPUTERNAME_LENGTH + 1];
unsigned long len = MAX_COMPUTERNAME_LENGTH + 1;
if(GetComputerName(buf, &len)){
hostName = buf;
}
}
//---------------------------------------------------------------------------
void __fastcall TmainForm::Get_UserName(AnsiString &userName)
{
char buf[MAX_COMPUTERNAME_LENGTH + 1];
unsigned long len = MAX_COMPUTERNAME_LENGTH + 1;
if(GetUserName(buf, &len)){
userName = buf;
}
}
//---------------------------------------------------------------------------
void __fastcall TmainForm::Get_IpAddress(AnsiString &ipAdd)
{
char local_name[MAXSTRING];
char buf[MAXSTRING];
struct hostent *h_ent;
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested = MAKEWORD(2, 0);
WSAStartup(wVersionRequested, &wsaData);
gethostname(local_name, sizeof(local_name));
h_ent = gethostbyname(local_name);
memset(buf, 0x00, sizeof(buf));
sprintf(buf, "%d.%d.%d.%d",
(unsigned char)*(*h_ent->h_addr_list),
(unsigned char)*(*h_ent->h_addr_list+1),
(unsigned char)*(*h_ent->h_addr_list+2),
(unsigned char)*(*h_ent->h_addr_list+3));
ipAdd = buf;
WSACleanup();
}
//---------------------------------------------------------------------------
bool __fastcall TmainForm::Get_MacAddress(AnsiString &macAdd)
{
DWORD ret;
ULONG i;
ULONG dwSize;
BYTE *pBuff;
PMIB_IFTABLE pIfTable;
char dressBuff[MAXSTRING];
dwSize = 0;
::GetIfTable(NULL, &dwSize, TRUE);
pBuff = new BYTE[dwSize];
pIfTable = (PMIB_IFTABLE)pBuff;
ret = ::GetIfTable(pIfTable,&dwSize,TRUE);
if(ret == NO_ERROR)
{
for(i = 0; i < pIfTable->dwNumEntries; i++)
{
sprintf(dressBuff, "%02X:%02X:%02X:%02X:%02X:%02X",
pIfTable->table[i].bPhysAddr[0],
pIfTable->table[i].bPhysAddr[1],
pIfTable->table[i].bPhysAddr[2],
pIfTable->table[i].bPhysAddr[3],
pIfTable->table[i].bPhysAddr[4],
pIfTable->table[i].bPhysAddr[5]);
macAdd = dressBuff;
}
delete pBuff;
return true;
}
delete pBuff;
return false;
}
//---------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
MAC アドレスの取得は上記の方法の他に NetBios を使ったものもあります。 しかし、NetBios を使った場合はネットワークに接続されていないと MAC アドレスが検出出来ません。 以下に NetBios を使ったコードも書いておきますが……使用方法が限定されるかな。 ネットワークが必須のプログラムならイイけど、スタンドアロンでも使う場合はマズイ。
----- Unit1.h --------------------------------------------------------------------------------------
#include <stdio.h>
#include <nb30.h>
----------------------------------------------------------------------------------------------------
----- Unit1.cpp ------------------------------------------------------------------------------------
void __fastcall TmainForm::FormCreate(TObject *Sender)
{
//window のタイトル部分に「MAC アドレス」を表示。
AnsiString macAdd;
LANA_ENUM AdapterList;
NCB Ncb;
//Netbios でアダプタのリストを取得。
memset(&Ncb, 0, sizeof(NCB));
Ncb.ncb_command = NCBENUM;
Ncb.ncb_buffer = (unsigned char *)&AdapterList;
Ncb.ncb_length = sizeof(AdapterList);
Netbios(&Ncb);
if(GetAdapterInfo(AdapterList.lana[0], macAdd)){
Caption = "MAC [" + macAdd + "]";
}
else{
Caption = "MAC アドレスの取得に失敗しました。";
}
}
//---------------------------------------------------------------------------
bool __fastcall TmainForm::GetAdapterInfo(int adapter_num, AnsiString &macAdd)
{
NCB Ncb;
memset(&Ncb, 0, sizeof(Ncb));
Ncb.ncb_command = NCBRESET;
Ncb.ncb_lana_num = adapter_num;
if (Netbios(&Ncb) != NRC_GOODRET){
macAdd = "bad (NCBRESET): ";
macAdd += Ncb.ncb_retcode;
return false;
}
memset(&Ncb, 0, sizeof(Ncb));
Ncb.ncb_command = NCBASTAT;
Ncb.ncb_lana_num = adapter_num;
strcpy((char *) Ncb.ncb_callname, "*");
struct ASTAT{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff[30];
}Adapter;
memset(&Adapter, 0, sizeof(Adapter));
Ncb.ncb_buffer = (unsigned char *)&Adapter;
Ncb.ncb_length = sizeof(Adapter);
if(Netbios(&Ncb) == 0){
char acMAC[18];
sprintf(acMAC, "%02X:%02X:%02X:%02X:%02X:%02X",
int (Adapter.adapt.adapter_address[0]),
int (Adapter.adapt.adapter_address[1]),
int (Adapter.adapt.adapter_address[2]),
int (Adapter.adapt.adapter_address[3]),
int (Adapter.adapt.adapter_address[4]),
int (Adapter.adapt.adapter_address[5]));
macAdd = acMAC;
return true;
}
else{
macAdd = "bad (NCBASTAT): ";
macAdd += Ncb.ncb_retcode;
return false;
}
}
//---------------------------------------------------------------------------
----------------------------------------------------------------------------------------------------
NIC 情報 More ログイン