// MainUnit.cpp
// +------------------------------------------------------------------------+
// | Get Adapters Information
// |
// | IDE : WindowsXP SP2
// | Borland C++ Builder Professional Ver6.0 UP4
// | HISTORY : Created by HISOAP on 2006/05/17
// |
// | Note : [ プロジェクト] → [ オプション ] →「ディレクトリ/条件」タブ
// | →「ライブラリパス」ボタンで "$(BCB)\lib\Psdk" を追加すること!
// +------------------------------------------------------------------------+
#include <vcl.h>
#pragma hdrstop
// +------------------------------------------------------------------------+
#include <iphlpapi.h> // for IP Helper API
#pragma comment(lib, "iphlpapi.lib") // for IP Helper API
#include "MainUnit.h"
// +------------------------------------------------------------------------+
#pragma package(smart_init)
#pragma resource "*.dfm"
TMainForm *MainForm;
// +------------------------------------------------------------------------+
// | !! Program Area !!
// +------------------------------------------------------------------------+
// +------------------------------------------------------------------------+
// | TMainForm::TMainForm
// |
// | FUNC :
// +------------------------------------------------------------------------+
__fastcall TMainForm::TMainForm(TComponent* Owner)
: TForm(Owner)
{
// +----------------------------+
// | フォームに初期値を設定 |
// +----------------------------+
Edit1->Text = ""; // ホスト名
Edit2->Text = ""; // ドメイン名
ComboBox2->Text = ""; // DNSサーバ
Edit3->Text = ""; // ノードタイプ
Edit4->Text = ""; // IPルーティング
Edit5->Text = ""; // WINSプロキシー
Edit6->Text = ""; // NetBIOSの解決にDNSを使用
ComboBox1->Text = ""; // アダプタ説明
Memo1->Clear(); // アダプタ詳細
}
// +------------------------------------------------------------------------+
// | TMainForm::FormShow
// |
// | FUNC : ホスト情報を表示
// +------------------------------------------------------------------------+
void __fastcall TMainForm::FormShow(TObject *Sender)
{
DWORD fiSize, aiSize;
PFIXED_INFO pFixedInfo;
PIP_ADAPTER_INFO pAdapt;
PIP_ADDR_STRING pAddrStr;
AnsiString AdapterName;
// +----------------------+
// | GetNetworkParams |
// +----------------------+
// --- ホスト情報の格納に必要なサイズの呼び出し
fiSize = 0;
if(GetNetworkParams(NULL, &fiSize) != ERROR_BUFFER_OVERFLOW){
MessageDlg("E101: GetNetworkParams().", mtWarning, TMsgDlgButtons() << mbOK, 0);
return;
}
// --- 必要サイズ分のメモリを確保
pFixedInfo = (PFIXED_INFO)GlobalAlloc(GPTR, fiSize);
if(pFixedInfo == NULL){
MessageDlg("E102: GlobalAlloc().", mtWarning, TMsgDlgButtons() << mbOK, 0);
return;
}
// --- ホスト情報を取得し、FIXED_INFO構造体に格納
if(GetNetworkParams(pFixedInfo, &fiSize) != ERROR_SUCCESS){
MessageDlg("E103: GetNetworkParams().", mtWarning, TMsgDlgButtons() << mbOK, 0);
return;
}
// --- ホスト名
Edit1->Text = pFixedInfo->HostName;
// --- ドメイン名
Edit2->Text = pFixedInfo->DomainName;
// --- DNSサーバ
ComboBox2->Items->Add(pFixedInfo->DnsServerList.IpAddress.String);
pAddrStr = pFixedInfo->DnsServerList.Next;
while(pAddrStr != NULL){
ComboBox2->Items->Add(pAddrStr->IpAddress.String);
pAddrStr = pAddrStr->Next;
}
ComboBox2->ItemIndex = 0; // ItemIndexの"0"を表示
// --- ノードタイプ
switch(pFixedInfo->NodeType){
case 1:
Edit3->Text = "Broadcast";
break;
case 2:
Edit3->Text = "Peer to peer";
break;
case 4:
Edit3->Text = "Mixed";
break;
case 8:
Edit3->Text = "Hybrid";
break;
default:
Edit3->Text = "Unknown Node";
}
// --- IPルーティング
if(pFixedInfo->EnableRouting){
Edit4->Text = "Enabled";
}else{
Edit4->Text = "Disabled";
}
// --- WINS プロキシー
if(pFixedInfo->EnableProxy){
Edit5->Text = "Enable";
}else{
Edit5->Text = "Disabled";
}
// --- NetBIOS の解決に DNS を使用
if(pFixedInfo->EnableDns){
Edit6->Text = "Yes";
}else{
Edit6->Text = "No";
}
// --- メモリの解放
GlobalFree(pFixedInfo);
// +---------------------+
// | GetAdaptersInfo |
// +---------------------+
// --- アダプタ情報の格納に必要なサイズの呼び出し
aiSize = 0;
if(GetAdaptersInfo(NULL, &aiSize) != ERROR_BUFFER_OVERFLOW){
MessageDlg("E104: GetAdaptersInfo().", mtWarning, TMsgDlgButtons() << mbOK, 0);
return;
}
// --- 必要サイズ分のメモリを確保し、グローバル変数 "pAdapterInfo" にポインタをセット
pAdapterInfo = (PIP_ADAPTER_INFO)GlobalAlloc(GPTR, aiSize);
if(pAdapterInfo == NULL){
MessageDlg("E105: GlobalAlloc().", mtWarning, TMsgDlgButtons() << mbOK, 0);
return;
}
// --- アダプタ情報を取得し、IP_ADAPTER_INFO構造体に格納
if(GetAdaptersInfo(pAdapterInfo, &aiSize) != 0){
MessageDlg("E106: GetAdaptersInfo().", mtWarning, TMsgDlgButtons() << mbOK, 0);
return;
}
// --- リンクリストが終了するまでwhileループで表示
pAdapt = pAdapterInfo;
while(pAdapt){
// --- アダプタ説明
AdapterName = pAdapt->Description;
ComboBox1->Items->Add(AdapterName);
pAdapt = pAdapt->Next;
}
ComboBox1->ItemIndex = 0; // ItemIndexの"0"を表示
// --- アダプタ詳細を表示
showAdaptor(ComboBox1->ItemIndex);
}
// +------------------------------------------------------------------------+
// | TMainForm::showAdaptor
// |
// | FUNC : アドプタ詳細を表示
// +------------------------------------------------------------------------+
void __fastcall TMainForm::showAdaptor(int adaptrNum)
{
Memo1->Lines->Clear();
PIP_ADAPTER_INFO pAdapt;
PIP_ADDR_STRING pAddrStr;
int counter = 0;
AnsiString TempStr0, TempStr1;
IP_ADDR_STRING *pIPAddr;
struct tm *newtime;
// --- リンクリストをたどる
pAdapt = pAdapterInfo;
while(pAdapt){
if(adaptrNum == counter++){
break;
}
pAdapt = pAdapt->Next;
}
// --- アダプタ名(UID形式)
Memo1->Lines->Add("Adapter Name : "+(AnsiString)pAdapt->AdapterName);
// --- アダプタ・インデックス
Memo1->Lines->Add("Adapter Index : "+IntToStr(pAdapt->Index));
// ---- アダプタ・タイプ
switch(pAdapt->Type){
case MIB_IF_TYPE_ETHERNET:
Memo1->Lines->Add("Adapter Type : ETHERNET");
break;
case MIB_IF_TYPE_TOKENRING:
Memo1->Lines->Add("Adapter Type : TOKEN RING");
break;
case MIB_IF_TYPE_FDDI:
Memo1->Lines->Add("Adapter Type : FDDI");
break;
case MIB_IF_TYPE_PPP:
Memo1->Lines->Add("Adapter Type : PPP");
break;
case MIB_IF_TYPE_LOOPBACK:
Memo1->Lines->Add("Adapter Type : LOOPBACK");
break;
case MIB_IF_TYPE_SLIP:
Memo1->Lines->Add("Adapter Type : SLIP");
break;
case MIB_IF_TYPE_OTHER:
Memo1->Lines->Add("Adapter Type : OTHER");
break;
default:
Memo1->Lines->Add("Adapter Type : UNKNOWN");
}
Memo1->Lines->Add("----------------------------------------------");
// --- 物理アドレス
TempStr1 = "";
for(unsigned int i=0; i < pAdapt->AddressLength; i++){
if(i == (pAdapt->AddressLength - 1)){
TempStr0.printf("%.2X", (int)pAdapt->Address[i]);
}else{
TempStr0.printf("%.2X-", (int)pAdapt->Address[i]);
}
TempStr1 += TempStr0;
}
Memo1->Lines->Add("Physical Address . . . . . : " + TempStr1);
// --- DHCPの有効/無効
if(pAdapt->DhcpEnabled){
Memo1->Lines->Append("DHCP Enabled . . . . . . . : Yes");
}else{
Memo1->Lines->Append("DHCP Enabled . . . . . . . : No");
}
// --- IPアドレス、サブネットマスク
pAddrStr = &(pAdapt->IpAddressList);
while(pAddrStr){
Memo1->Lines->Append("IP Address . . . . . . . . : " + (AnsiString)pAddrStr->IpAddress.String);
Memo1->Lines->Append("Subnet Mask. . . . . . . . : " + (AnsiString)pAddrStr->IpMask.String);
pAddrStr = pAddrStr->Next;
}
// --- デフォルトゲートウエイ
Memo1->Lines->Append("Default Gateway. . . . . . : " + (AnsiString)pAdapt->GatewayList.IpAddress.String);
pIPAddr = pAdapt->GatewayList.Next;
while ( pIPAddr ) {
Memo1->Lines->Append(" " + (AnsiString)pIPAddr->IpAddress.String);
pIPAddr = pIPAddr ->Next;
}
// --- DHCPサーバのIPアドレス
Memo1->Lines->Append("DHCP Server. . . . . . . . : " + (AnsiString)pAdapt->DhcpServer.IpAddress.String);
// --- DNSサーバのIPアドレス
// --- プライマリWINSサーバのIPアドレス
Memo1->Lines->Append("Primary WINS Server. . . . : " + (AnsiString)pAdapt->PrimaryWinsServer.IpAddress.String);
// --- セカンダリWINSサーバのIPアドレス
Memo1->Lines->Append("Secondary WINS Server. . . : " + (AnsiString)pAdapt->SecondaryWinsServer.IpAddress.String);
// --- DHCPアドレスを獲得した時間
newtime = gmtime(&pAdapt->LeaseObtained);
Memo1->Lines->Append("Lease Obtained . . . . . . : " + (AnsiString)asctime(newtime));
// --- DHCPアドレスを解放する時期
newtime = gmtime(&pAdapt->LeaseExpires);
Memo1->Lines->Append("Lease Expires. . . . . . . : " + (AnsiString)asctime(newtime));
}
// +------------------------------------------------------------------------+
// | TMainForm::ComboBox1Change
// |
// | FUNC :
// +------------------------------------------------------------------------+
void __fastcall TMainForm::ComboBox1Change(TObject *Sender)
{
showAdaptor(ComboBox1->ItemIndex);
}
// +------------------------------------------------------------------------+
// | TMainForm::FormClose
// |
// | FUNC :
// +------------------------------------------------------------------------+
void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
{
// --- メモリの解放
GlobalFree(pAdapterInfo);
}
// +------------------------------------------------------------------------+
// | TMainForm::Button1Click
// |
// | FUNC :
// +------------------------------------------------------------------------+
void __fastcall TMainForm::Button1Click(TObject *Sender)
{
Close();
}
|