Конференция "Сети" » Определение mac-адреса [D7, WinXP]
 
  • BioHEX © (18.12.09 10:24) [0]
    Такая беда, при
    var
    str:TStringList;
    begin
    str:=TStringList.Create;
    str.LoadFromFile('mac.txt');
    Memo1.Text:=str.Text;
    str.Free;
    end;


    теряется большая часть информации. Вот код при помощи которого производилась запись mak.txt:
    program GetMac;

    uses
     Windows,
     SysUtils,
     Classes;

    const
    MAX_ADAPTER_NAME_LENGTH = 256;
    MAX_ADAPTER_DESCRIPTION_LENGTH = 128;
    MAX_ADAPTER_ADDRESS_LENGTH = 8;

    type
    //------IP address structures---------------------------------------------------
    PIP_ADDRESS_STRING = ^IP_ADDRESS_STRING;
    IP_ADDRESS_STRING = array[0..15] of char; // IP as string

    PIP_ADDR_STRING = ^IP_ADDR_STRING;
    IP_ADDR_STRING = record
    Next: PIP_ADDR_STRING;
    IpAddress: IP_ADDRESS_STRING;
    IpMask: IP_ADDRESS_STRING;
    Context: DWORD;
    end;
    //------ADAPTER INFO STRUCTURES-------------------------------------------------
    PIP_ADAPTER_INFO = ^IP_ADAPTER_INFO;
    IP_ADAPTER_INFO = record
    Next: PIP_ADAPTER_INFO;
    ComboIndex: DWORD;
    AdapterName: array[1..MAX_ADAPTER_NAME_LENGTH + 4] of char;
    Description: array[1..MAX_ADAPTER_DESCRIPTION_LENGTH + 4] of char;
    AddressLength: UINT;
    Address: array[1..MAX_ADAPTER_ADDRESS_LENGTH] of byte;
    Index: DWORD;
    aType: UINT;
    DHCPEnabled: UINT;
    CurrentIPAddress: PIP_ADDR_STRING;
    IPAddressList: IP_ADDR_STRING;
    GatewayList: IP_ADDR_STRING;
    DHCPServer: IP_ADDR_STRING;
    HaveWINS: BOOL;
    PrimaryWINSServer: IP_ADDR_STRING;
    SecondaryWINSServer: IP_ADDR_STRING;
    LeaseObtained: LongInt;
    LeaseExpires: LongInt;
    SpareStuff: array [1..200] of char;
    end;

    function GetAdaptersInfo(pAdapterInfo: PIP_ADAPTER_INFO;
    pOutBufLen: PULONG): DWORD; stdcall;
    external 'Iphlpapi.dll' name 'GetAdaptersInfo';

    const
    OutBufLen: ULONG = 2000;
    AddrLen = 6;

    var
    AdapterInfo: IP_ADAPTER_INFO;
    Result: DWORD;
    i: integer;
    Next: PIP_ADAPTER_INFO;
    str:TStringList;
    mac:String;
    begin
    str:=TStringList.Create;
    Result:= GetAdaptersInfo(@AdapterInfo, @OutBufLen);
    if Result = 0 then
    begin
    Next:= @AdapterInfo;
    repeat
    str.Add('Description: '+Next^.Description);
    for i := 0 to AddrLen do
    begin
    mac:=mac+IntToHex(Next^.Address[i],2);
    if i <> AddrLen then mac:=mac+'-';
    end;
    str.Add('MAC address: '+mac);
    Next:= Next^.Next; // переходим к следующему адаптеру
    str.Add('');
    until Next = nil;
    end
    else str.Add('Error. Result code: '+IntToStr(Result));

    str.SaveToFile('mac.txt');

    str.Free;
    end.

  • Vitalts (18.12.09 10:36) [1]
    Дык посмотри что в текстовик пишеться. После МАК-адреса куча нулей идет, str.Text - есть стринг, и данный символ означет конец стринга, вот и режеться.
    Делай не for i := 0 to AddrLen do, а до фиксированного значения. МАК состоит из 6-ти байт. И походу нулевой байт тоже нужно упускать, проконсультируйся с мануалом.
  • BioHEX © (18.12.09 10:41) [2]
    Ок, спасибо.
  • BioHEX © (18.12.09 10:44) [3]
    const
     AddrLen=6
  • BioHEX © (18.12.09 10:46) [4]
    значение и так фиксировано.
  • Vitalts (18.12.09 10:51) [5]
    Соврал я, ошибка в
    repeat
    str.Add('Description: '+Next^.Description);

    На последнем шаге пишеться пустой Next^.Description

    Юзай While
  • Vitalts (18.12.09 10:57) [6]
    Или проверку на Next = nil перед обращением
  • BioHEX © (18.12.09 11:08) [7]
    изменил цикл на

    while Next<>nil do
    begin
    end;



    не помогает
  • BioHEX © (18.12.09 11:11) [8]
    соответственно проверка на Next = nil перед обращением тоже отпадает
  • BioHEX © (23.12.09 16:58) [9]
    Вопрос снят. Полностью переписал код.
 
Конференция "Сети" » Определение mac-адреса [D7, WinXP]
Есть новые Нет новых   [134438   +31][b:0][p:0.002]