パスワードを忘れた? アカウント作成
452720 journal

novaの日記: NIC 情報

日記 by nova

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;
 }
}
//---------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

人生の大半の問題はスルー力で解決する -- スルー力研究専門家

読み込み中...