2008-11-28 10 views
10

के साथ एक इंटरनेट कनेक्शन सक्रियण का पता लगाएं मैं थोड़ी देर के लिए एक 3 जी वायरलेस कार्ड का उपयोग कर रहा हूं और हर बार जब मैं कनेक्ट करता हूं, तो मेरा एंटी-वायरस अपडेट को सक्रिय करता है।डेल्फी

मुझे आश्चर्य है कि Win32 API का उपयोग उन कार्यों का सेट है जिन्हें मैं उपयोग कर सकता हूं, या तो इंटरनेट कनेक्शन की घटना के बारे में अधिसूचित या पूछताछ कर सकता हूं?

और क्या पहले से ही डेल्फी के लिए पोर्ट हेडर का एक सेट है?

+1

इंटरनेट कनेक्शन परिभाषित करें? इंटरनेट क्या है? –

+0

मुझे लगता है कि यह एक नेटवर्क इंटरफेस आ जाएगा, लेकिन मुझे वास्तव में यह नहीं पता कि एंटी-वायरस इसके लिए जांच कैसे करता है। –

उत्तर

19

जब भी वे वीपीएन पर हमारे नेटवर्क को कनेक्ट करते हैं तो मैंने उपयोगकर्ता की लॉगऑन स्क्रिप्ट चलाने के लिए एक प्रोजेक्ट पर काम किया। ऐसा करने के लिए, मैंने एक सहायक इकाई लिखा जो एडाप्टर जानकारी पुनर्प्राप्त करता है और इसे एक साधारण रिकॉर्ड में संग्रहीत करता है।

मैं तो सेटअप ऊपर एक रजिस्ट्री अधिसूचना, see here for how to do that in Delphi

रजिस्ट्री अधिसूचना HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces पर था। यह अधिसूचना घटना हर बार विंडोज़ को एक नया आईपी पता प्राप्त करती है, या एक एडाप्टर कनेक्शन जानकारी में किसी प्रकार का परिवर्तन करता है। जब इस घटना को निकाल दिया गया, तो मैंने एडाप्टर के बारे में अद्यतन जानकारी पुनर्प्राप्त करने के लिए फ़ंक्शन (नीचे दिए गए कोड में) कहा। मैंने इस नई जानकारी की तुलना मेरी पिछली दर्ज की गई जानकारी से की है ... जिसका मतलब है कि मुझे पता था कि कुछ बदल गया है या नहीं, यह जानने के लिए मुझे पिछली एडाप्टर जानकारी क्वेरी को सहेजना था।

किसी भी तरह, यहाँ मेरी सहायक इकाई है:

:

unit uAdapterInfo; 

interface 

uses 
    Classes, 
    SysUtils; 

const 
    MAX_INTERFACE_NAME_LEN = $100; 
    ERROR_SUCCESS = 0; 
    MAXLEN_IFDESCR = $100; 
    MAXLEN_PHYSADDR = 8; 

    MIB_IF_OPER_STATUS_NON_OPERATIONAL = 0; 
    MIB_IF_OPER_STATUS_UNREACHABLE = 1; 
    MIB_IF_OPER_STATUS_DISCONNECTED = 2; 
    MIB_IF_OPER_STATUS_CONNECTING = 3; 
    MIB_IF_OPER_STATUS_CONNECTED = 4; 
    MIB_IF_OPER_STATUS_OPERATIONAL = 5; 

    MIB_IF_TYPE_OTHER = 1; 
    MIB_IF_TYPE_ETHERNET = 6; 
    MIB_IF_TYPE_TOKENRING = 9; 
    MIB_IF_TYPE_FDDI  = 15; 
    MIB_IF_TYPE_PPP  = 23; 
    MIB_IF_TYPE_LOOPBACK = 24; 
    MIB_IF_TYPE_SLIP  = 28; 

    MIB_IF_ADMIN_STATUS_UP  = 1; 
    MIB_IF_ADMIN_STATUS_DOWN = 2; 
    MIB_IF_ADMIN_STATUS_TESTING = 3; 

    _MAX_ROWS_ = 20; 
    ANY_SIZE = 1; 


type 
    MIB_IFROW = record 
    wszName: array[0 .. (MAX_INTERFACE_NAME_LEN * 2 - 1)] of ansichar; 
    dwIndex: longint; 
    dwType:  longint; 
    dwMtu:  longint; 
    dwSpeed: longint; 
    dwPhysAddrLen: longint; 
    bPhysAddr: array[0 .. (MAXLEN_PHYSADDR - 1)] of byte; 
    dwAdminStatus: longint; 
    dwOperStatus: longint; 
    dwLastChange: longint; 
    dwInOctets: longint; 
    dwInUcastPkts: longint; 
    dwInNUcastPkts: longint; 
    dwInDiscards: longint; 
    dwInErrors: longint; 
    dwInUnknownProtos: longint; 
    dwOutOctets: longint; 
    dwOutUcastPkts: longint; 
    dwOutNUcastPkts: longint; 
    dwOutDiscards: longint; 
    dwOutErrors: longint; 
    dwOutQLen: longint; 
    dwDescrLen: longint; 
    bDescr:  array[0 .. (MAXLEN_IFDESCR - 1)] of ansichar; 
    end; 

type 
    MIB_IPADDRROW = record 
    dwAddr:  longint; 
    dwIndex:  longint; 
    dwMask:  longint; 
    dwBCastAddr: longint; 
    dwReasmSize: longint; 
    unused1:  word; 
    unused2:  word; 
    end; 

type 
    _IfTable = record 
    nRows: longint; 
    ifRow: array[1.._MAX_ROWS_] of MIB_IFROW; 
    end; 

type 
    _IpAddrTable = record 
    dwNumEntries: longint; 
    table: array[1..ANY_SIZE] of MIB_IPADDRROW; 
    end; 



function GetIfTable(pIfTable: Pointer; var pdwSize: longint; bOrder: longint): longint; 
    stdcall; 
function GetIpAddrTable(pIpAddrTable: Pointer; var pdwSize: longint; 
    bOrder: longint): longint; stdcall; 

function Get_if_type(iType: integer): string; 
function Get_if_admin_status(iStatus: integer): string; 
function Get_if_oper_status(iStatus: integer): string; 


implementation 

function GetIfTable; stdcall; external 'IPHLPAPI.DLL'; 
function GetIpAddrTable; stdcall; external 'IPHLPAPI.DLL'; 

function Get_if_type(iType: integer): string; 
var 
    sResult: string; 
begin 
    sResult := 'UNKNOWN'; 
    case iType of 
    1: sResult := 'Other'; 
    6: sResult := 'Ethernet'; 
    9: sResult := 'Tokenring'; 
    15: sResult := 'FDDI'; 
    23: sResult := 'PPP'; 
    24: sResult := 'Local loopback'; 
    28: sResult := 'SLIP'; 
    37: sResult := 'ATM'; 
    71: sResult := 'IEEE 802.11'; 
    131: sResult := 'Tunnel'; 
    144: sResult := 'IEEE 1394 (Firewire)'; 
    end; 

    Result := sResult; 
end; 

function Get_if_admin_status(iStatus: integer): string; 
var 
    sResult: string; 
begin 
    sResult := 'UNKNOWN'; 

    case iStatus of 
    1: sResult := 'UP'; 
    2: sResult := 'DOWN'; 
    3: sResult := 'TESTING'; 
    end; 

    Result := sResult; 
end; 

function Get_if_oper_status(iStatus: integer): string; 
var 
    sResult: string; 
begin 
    sResult := 'UNKNOWN'; 

    case iStatus of 
    0: sResult := 'NON_OPERATIONAL'; 
    1: sResult := 'UNREACHABLE'; 
    2: sResult := 'DISCONNECTED'; 
    3: sResult := 'CONNECTING'; 
    4: sResult := 'CONNECTED'; 
    5: sResult := 'OPERATIONAL'; 
    end; 

    Result := sResult; 
end; 

end. 

एक और इकाई से इस यूनिट का उपयोग करने के लिए, मैं निम्नलिखित समारोह है, जो TAdapterInfo नामक कस्टम प्रकार आबादी (मेरी मुख्य इकाई में घोषित) बनाया

type 
    TAdapterInfo = array of record 
    dwIndex: longint; 
    dwType:  longint; 
    dwMtu:  longint; 
    dwSpeed: extended; 
    dwPhysAddrLen: longint; 
    bPhysAddr: string; 
    dwAdminStatus: longint; 
    dwOperStatus: longint; 
    dwLastChange: longint; 
    dwInOctets: longint; 
    dwInUcastPkts: longint; 
    dwInNUcastPkts: longint; 
    dwInDiscards: longint; 
    dwInErrors: longint; 
    dwInUnknownProtos: longint; 
    dwOutOctets: longint; 
    dwOutUcastPkts: longint; 
    dwOutNUcastPkts: longint; 
    dwOutDiscards: longint; 
    dwOutErrors: longint; 
    dwOutQLen: longint; 
    dwDescrLen: longint; 
    bDescr:  string; 
    sIpAddress: string; 
    sIpMask: string; 
    end; 

//////////

function Get_EthernetAdapterDetail(var AdapterDataFound: TAdapterInfo): boolean; 
var 
    pIfTable: ^_IfTable; 
    pIpTable: ^_IpAddrTable; 
    ifTableSize, ipTableSize: longint; 
    tmp:  string; 
    i, j, k, m: integer; 
    ErrCode: longint; 
    sAddr, sMask: in_addr; 
    IPAddresses, IPMasks: TStringList; 
    sIPAddressLine, sIPMaskLine: string; 
    bResult: boolean; 
begin 
    bResult := True; //default return value 
    pIfTable := nil; 
    pIpTable := nil; 

    IPAddresses := TStringList.Create; 
    IPMasks  := TStringList.Create; 

    try 
    // First: just get the buffer size. 
    // TableSize returns the size needed. 
    ifTableSize := 0; // Set to zero so the GetIfTabel function 
    // won't try to fill the buffer yet, 
    // but only return the actual size it needs. 
    GetIfTable(pIfTable, ifTableSize, 1); 
    if (ifTableSize < SizeOf(MIB_IFROW) + Sizeof(longint)) then 
    begin 
     bResult := False; 
     Result := bResult; 
     Exit; // less than 1 table entry?! 
    end; 

    ipTableSize := 0; 
    GetIpAddrTable(pIpTable, ipTableSize, 1); 
    if (ipTableSize < SizeOf(MIB_IPADDRROW) + Sizeof(longint)) then 
    begin 
     bResult := False; 
     Result := bResult; 
     Exit; // less than 1 table entry?! 
    end; 

    // Second: 
    // allocate memory for the buffer and retrieve the 
    // entire table. 
    GetMem(pIfTable, ifTableSize); 
    ErrCode := GetIfTable(pIfTable, ifTableSize, 1); 

    if ErrCode <> ERROR_SUCCESS then 
    begin 
     bResult := False; 
     Result := bResult; 
     Exit; // OK, that did not work. 
     // Not enough memory i guess. 
    end; 

    GetMem(pIpTable, ipTableSize); 
    ErrCode := GetIpAddrTable(pIpTable, ipTableSize, 1); 

    if ErrCode <> ERROR_SUCCESS then 
    begin 
     bResult := False; 
     Result := bResult; 
     Exit; 
    end; 

    for k := 1 to pIpTable^.dwNumEntries do 
    begin 
     sAddr.S_addr := pIpTable^.table[k].dwAddr; 
     sMask.S_addr := pIpTable^.table[k].dwMask; 

     sIPAddressLine := Format('0x%8.8x', [(pIpTable^.table[k].dwIndex)]) + 
     '=' + Format('%s', [inet_ntoa(sAddr)]); 
     sIPMaskLine := Format('0x%8.8x', [(pIpTable^.table[k].dwIndex)]) + 
     '=' + Format('%s', [inet_ntoa(sMask)]); 

     IPAddresses.Add(sIPAddressLine); 
     IPMasks.Add(sIPMaskLine); 
    end; 

    SetLength(AdapterDataFound, pIfTable^.nRows); //initialize the array or records 
    for i := 1 to pIfTable^.nRows do 
     try 
     //if pIfTable^.ifRow[i].dwType=MIB_IF_TYPE_ETHERNET then 
     //begin 
     m := i - 1; 
     AdapterDataFound[m].dwIndex := 4;//(pIfTable^.ifRow[i].dwIndex); 
     AdapterDataFound[m].dwType := (pIfTable^.ifRow[i].dwType); 
     AdapterDataFound[m].dwIndex := (pIfTable^.ifRow[i].dwIndex); 
     AdapterDataFound[m].sIpAddress := 
      IPAddresses.Values[Format('0x%8.8x', [(pIfTable^.ifRow[i].dwIndex)])]; 
     AdapterDataFound[m].sIpMask := 
      IPMasks.Values[Format('0x%8.8x', [(pIfTable^.ifRow[i].dwIndex)])]; 
     AdapterDataFound[m].dwMtu := (pIfTable^.ifRow[i].dwMtu); 
     AdapterDataFound[m].dwSpeed := (pIfTable^.ifRow[i].dwSpeed); 
     AdapterDataFound[m].dwAdminStatus := (pIfTable^.ifRow[i].dwAdminStatus); 
     AdapterDataFound[m].dwOperStatus := (pIfTable^.ifRow[i].dwOperStatus); 
     AdapterDataFound[m].dwInUcastPkts := (pIfTable^.ifRow[i].dwInUcastPkts); 
     AdapterDataFound[m].dwInNUcastPkts := (pIfTable^.ifRow[i].dwInNUcastPkts); 
     AdapterDataFound[m].dwInDiscards := (pIfTable^.ifRow[i].dwInDiscards); 
     AdapterDataFound[m].dwInErrors := (pIfTable^.ifRow[i].dwInErrors); 
     AdapterDataFound[m].dwInUnknownProtos := (pIfTable^.ifRow[i].dwInUnknownProtos); 
     AdapterDataFound[m].dwOutNUcastPkts := (pIfTable^.ifRow[i].dwOutNUcastPkts); 
     AdapterDataFound[m].dwOutUcastPkts := (pIfTable^.ifRow[i].dwOutUcastPkts); 
     AdapterDataFound[m].dwOutDiscards := (pIfTable^.ifRow[i].dwOutDiscards); 
     AdapterDataFound[m].dwOutErrors := (pIfTable^.ifRow[i].dwOutErrors); 
     AdapterDataFound[m].dwOutQLen := (pIfTable^.ifRow[i].dwOutQLen); 
     AdapterDataFound[m].bDescr := (pIfTable^.ifRow[i].bDescr); 

     tmp := ''; 
     for j := 0 to pIfTable^.ifRow[i].dwPhysAddrLen - 1 do 
     begin 
      if Length(tmp) > 0 then 
      tmp := tmp + '-' + format('%.2x', [pIfTable^.ifRow[i].bPhysAddr[j]]) 
      else 
      tmp := tmp + format('%.2x', [pIfTable^.ifRow[i].bPhysAddr[j]]); 
     end; 

     if Length(tmp) > 0 then 
     begin 
      AdapterDataFound[m].bPhysAddr := tmp; 
     end; 
     except 
     bResult := False; 
     Result := bResult; 
     Exit; 
     end; 
    finally 
    if Assigned(pIfTable) then 
    begin 
     FreeMem(pIfTable, ifTableSize); 
    end; 

    FreeAndNil(IPMasks); 
    FreeAndNil(IPAddresses); 
    end; 

    Result := bResult; 
end; 

एक पूरी तरह से पक्ष पर नहीं ई, मैंने ifconfig -a का डुप्लिकेट बनाने के लिए इस इकाई और लगभग सटीक कोड का भी उपयोग किया, जो can be found on github है। मैंने मुख्य रूप से इसे इस अभ्यास को पूरा करने के तरीके को पढ़ाने में एक अभ्यास के रूप में किया।

+0

आपका कोड इस लाइन पर क्रैश हो जाता है (रेंज चेक त्रुटि): के लिए: = 1 से pIpTable^.dwNumEntries do ... – Ampere

+0

एक टिप्पणीकर्ता ने मुझे एक फिक्स (जिसे मैंने यहां अपडेट किया) के साथ ईमेल किया: "मैंने इसे बदलने के बाद अच्छी तरह से लिखा "MIS_IFROW" प्रकार में "char" से "ansichar" से "wszName" और "bDescr" की घोषणा। मैंने Win 10 पर डेल्फी 10.1 में अपनी इकाई का उपयोग किया। " – Mick

3

WinINet में InternetGetConnectedState को देखें।

कुछ एप्लिकेशन एक ज्ञात सर्वर के लिए भी मतदान कर सकते हैं और जब तक वे एक वैध कनेक्शन प्राप्त नहीं करते हैं तब तक कुछ भी नहीं कर सकते हैं।

12
uses WinInet; 

function IsConnected: boolean; 
const 
    // local system uses a modem to connect to the Internet. 
    INTERNET_CONNECTION_MODEM  = 1; 
    // local system uses a local area network to connect to the Internet. 
    INTERNET_CONNECTION_LAN  = 2; 
    // local system uses a proxy server to connect to the Internet. 
    INTERNET_CONNECTION_PROXY  = 4; 
    // local system's modem is busy with a non-Internet connection. 
    INTERNET_CONNECTION_MODEM_BUSY = 8; 

var 
    dwConnectionTypes : DWORD; 
begin 
    dwConnectionTypes := INTERNET_CONNECTION_MODEM + 
         INTERNET_CONNECTION_LAN + 
         INTERNET_CONNECTION_PROXY; 
    Result := InternetGetConnectedState(@dwConnectionTypes,0); 
end; 
+0

यूप। मैं यही उपयोग करता हूं। मुझे यकीन नहीं है कि यह 100% विश्वसनीय है, हालांकि। – lkessler

+0

यह 100% विश्वसनीय नहीं है। – Mick

2

हेल्पर इकाई का उपयोग करने का एक उदाहरण उदाहरण यहां दिया गया है। यह एक छोटी परियोजना से है जिसे मैंने "ifconfig -a" अनुकरण करने के लिए लिखा था। यह एक कंसोल अनुप्रयोग परियोजना है।

program ifconfig; 

{$APPTYPE CONSOLE} 

uses 
    SysUtils, 
    Classes, 
    Winsock, 
    uAdapterInfo in 'uAdapterInfo.pas'; 

type 
    TAdapterInfo = array of record 
    dwIndex: longint; 
    dwType:  longint; 
    dwMtu:  longint; 
    dwSpeed: extended; 
    dwPhysAddrLen: longint; 
    bPhysAddr: string; 
    dwAdminStatus: longint; 
    dwOperStatus: longint; 
    dwLastChange: longint; 
    dwInOctets: longint; 
    dwInUcastPkts: longint; 
    dwInNUcastPkts: longint; 
    dwInDiscards: longint; 
    dwInErrors: longint; 
    dwInUnknownProtos: longint; 
    dwOutOctets: longint; 
    dwOutUcastPkts: longint; 
    dwOutNUcastPkts: longint; 
    dwOutDiscards: longint; 
    dwOutErrors: longint; 
    dwOutQLen: longint; 
    dwDescrLen: longint; 
    bDescr:  string; 
    sIpAddress: string; 
    sIpMask: string; 
    end; 




    function Get_EthernetAdapterDetail(var AdapterDataFound: TAdapterInfo): boolean; 
    var 
    pIfTable: ^_IfTable; 
    pIpTable: ^_IpAddrTable; 
    ifTableSize, ipTableSize: longint; 
    tmp:  string; 
    i, j, k, m: integer; 
    ErrCode: longint; 
    sAddr, sMask: in_addr; 
    IPAddresses, IPMasks: TStringList; 
    sIPAddressLine, sIPMaskLine: string; 
    bResult: boolean; 
    begin 
    bResult := True; //default return value 
    pIfTable := nil; 
    pIpTable := nil; 

    IPAddresses := TStringList.Create; 
    IPMasks  := TStringList.Create; 

    try 
     // First: just get the buffer size. 
     // TableSize returns the size needed. 
     ifTableSize := 0; // Set to zero so the GetIfTabel function 
     // won't try to fill the buffer yet, 
     // but only return the actual size it needs. 
     GetIfTable(pIfTable, ifTableSize, 1); 
     if (ifTableSize < SizeOf(MIB_IFROW) + Sizeof(longint)) then 
     begin 
     bResult := False; 
     Result := bResult; 
     Exit; // less than 1 table entry?! 
     end; 

     ipTableSize := 0; 
     GetIpAddrTable(pIpTable, ipTableSize, 1); 
     if (ipTableSize < SizeOf(MIB_IPADDRROW) + Sizeof(longint)) then 
     begin 
     bResult := False; 
     Result := bResult; 
     Exit; // less than 1 table entry?! 
     end; 

     // Second: 
     // allocate memory for the buffer and retrieve the 
     // entire table. 
     GetMem(pIfTable, ifTableSize); 
     ErrCode := GetIfTable(pIfTable, ifTableSize, 1); 

     if ErrCode <> ERROR_SUCCESS then 
     begin 
     bResult := False; 
     Result := bResult; 
     Exit; // OK, that did not work. 
     // Not enough memory i guess. 
     end; 

     GetMem(pIpTable, ipTableSize); 
     ErrCode := GetIpAddrTable(pIpTable, ipTableSize, 1); 

     if ErrCode <> ERROR_SUCCESS then 
     begin 
     bResult := False; 
     Result := bResult; 
     Exit; 
     end; 

     for k := 1 to pIpTable^.dwNumEntries do 
     begin 
     sAddr.S_addr := pIpTable^.table[k].dwAddr; 
     sMask.S_addr := pIpTable^.table[k].dwMask; 

     sIPAddressLine := Format('0x%8.8x', [(pIpTable^.table[k].dwIndex)]) + 
      '=' + Format('%s', [inet_ntoa(sAddr)]); 
     sIPMaskLine := Format('0x%8.8x', [(pIpTable^.table[k].dwIndex)]) + 
      '=' + Format('%s', [inet_ntoa(sMask)]); 

     IPAddresses.Add(sIPAddressLine); 
     IPMasks.Add(sIPMaskLine); 
     end; 

     SetLength(AdapterDataFound, pIfTable^.nRows); //initialize the array or records 
     for i := 1 to pIfTable^.nRows do 
     try 
      //if pIfTable^.ifRow[i].dwType=MIB_IF_TYPE_ETHERNET then 
      //begin 
      m := i - 1; 
      AdapterDataFound[m].dwIndex := 4;//(pIfTable^.ifRow[i].dwIndex); 
      AdapterDataFound[m].dwType := (pIfTable^.ifRow[i].dwType); 
      AdapterDataFound[m].dwIndex := (pIfTable^.ifRow[i].dwIndex); 
      AdapterDataFound[m].sIpAddress := 
      IPAddresses.Values[Format('0x%8.8x', [(pIfTable^.ifRow[i].dwIndex)])]; 
      AdapterDataFound[m].sIpMask := 
      IPMasks.Values[Format('0x%8.8x', [(pIfTable^.ifRow[i].dwIndex)])]; 
      AdapterDataFound[m].dwMtu := (pIfTable^.ifRow[i].dwMtu); 
      AdapterDataFound[m].dwSpeed := (pIfTable^.ifRow[i].dwSpeed); 
      AdapterDataFound[m].dwAdminStatus := (pIfTable^.ifRow[i].dwAdminStatus); 
      AdapterDataFound[m].dwOperStatus := (pIfTable^.ifRow[i].dwOperStatus); 
      AdapterDataFound[m].dwInUcastPkts := (pIfTable^.ifRow[i].dwInUcastPkts); 
      AdapterDataFound[m].dwInNUcastPkts := (pIfTable^.ifRow[i].dwInNUcastPkts); 
      AdapterDataFound[m].dwInDiscards := (pIfTable^.ifRow[i].dwInDiscards); 
      AdapterDataFound[m].dwInErrors := (pIfTable^.ifRow[i].dwInErrors); 
      AdapterDataFound[m].dwInUnknownProtos := (pIfTable^.ifRow[i].dwInUnknownProtos); 
      AdapterDataFound[m].dwOutNUcastPkts := (pIfTable^.ifRow[i].dwOutNUcastPkts); 
      AdapterDataFound[m].dwOutUcastPkts := (pIfTable^.ifRow[i].dwOutUcastPkts); 
      AdapterDataFound[m].dwOutDiscards := (pIfTable^.ifRow[i].dwOutDiscards); 
      AdapterDataFound[m].dwOutErrors := (pIfTable^.ifRow[i].dwOutErrors); 
      AdapterDataFound[m].dwOutQLen := (pIfTable^.ifRow[i].dwOutQLen); 
      AdapterDataFound[m].bDescr := (pIfTable^.ifRow[i].bDescr); 

      tmp := ''; 
      for j := 0 to pIfTable^.ifRow[i].dwPhysAddrLen - 1 do 
      begin 
      if Length(tmp) > 0 then 
       tmp := tmp + '-' + format('%.2x', [pIfTable^.ifRow[i].bPhysAddr[j]]) 
      else 
       tmp := tmp + format('%.2x', [pIfTable^.ifRow[i].bPhysAddr[j]]); 
      end; 

      if Length(tmp) > 0 then 
      begin 
      AdapterDataFound[m].bPhysAddr := tmp; 
      end; 
     except 
      bResult := False; 
      Result := bResult; 
      Exit; 
     end; 
    finally 
     if Assigned(pIfTable) then 
     begin 
     FreeMem(pIfTable, ifTableSize); 
     end; 

     FreeAndNil(IPMasks); 
     FreeAndNil(IPAddresses); 
    end; 

    Result := bResult; 
    end; 



var 
    AdapterData: TAdapterInfo; 
    i: integer; 
begin 
    try 
    WriteLn(''); 
    if Get_EthernetAdapterDetail(AdapterData) then 
    begin 
     for i := 0 to Length(AdapterData) - 1 do 
     begin 
     WriteLn(Format('0x%8.8x', [AdapterData[i].dwIndex])); 
     WriteLn('"' + AdapterData[i].bDescr + '"'); 
     Write(Format(#9 + 'Link encap: %s ', [Get_if_type(AdapterData[i].dwType)])); 

     if Length(AdapterData[i].bPhysAddr) > 0 then 
      Write('HWaddr: ' + AdapterData[i].bPhysAddr); 

     Write(#13 + #10 + #9 + 'inet addr:' + AdapterData[i].sIpAddress); 
     WriteLn(' Mask: ' + AdapterData[i].sIpMask); 
     WriteLn(Format(#9 + 'MTU: %d Speed:%.2f Mbps', [AdapterData[i].dwMtu, 
      (AdapterData[i].dwSpeed)/1000/1000])); 
     Write(#9 + 'Admin status:' + Get_if_admin_status(AdapterData[i].dwAdminStatus)); 
     WriteLn(' Oper status:' + Get_if_oper_status(AdapterData[i].dwOperStatus)); 
     WriteLn(#9 + Format('RX packets:%d dropped:%d errors:%d unkown:%d', 
      [AdapterData[i].dwInUcastPkts + AdapterData[i].dwInNUcastPkts, 
      AdapterData[i].dwInDiscards, AdapterData[i].dwInErrors, 
      AdapterData[i].dwInUnknownProtos])); 
     WriteLn(#9 + Format('TX packets:%d dropped:%d errors:%d txqueuelen:%d', 
      [AdapterData[i].dwOutUcastPkts + AdapterData[i].dwOutNUcastPkts, 
      AdapterData[i].dwOutDiscards, AdapterData[i].dwOutErrors, 
      AdapterData[i].dwOutQLen])); 

     WriteLn(''); 
     end; 
    end 
    else 
    begin 
     WriteLn(#13+#10+'*** Error retrieving adapter information'); 
    end; 
    except 
    on E: Exception do 
     Writeln(E.ClassName, ': ', E.Message); 
    end; 
end. 
+0

आपका कोड इस लाइन पर क्रैश होता है (रेंज चेक त्रुटि): के लिए: = 1 से pIpTable^.dwNumEntries do ... – Ampere

+0

अब तय किया जाना चाहिए।मैंने मूल रूप से डेल्फी 2007 के साथ संकलित किया (और लगभग 10 साल पहले लिखा था), लेकिन एक टिप्पणीकार ने देखा और बग को ठीक किया और कहा कि यह डेल्फी 10.1 बर्लिन में संकलित है। – Mick