Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Работа с сетью в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2012, 00:05   #1
Энджи
Новичок
Джуниор
 
Регистрация: 25.03.2012
Сообщений: 2
По умолчанию Получить информацию о сетевом адаптере

Всем привет, народ, срочно нужна помощь, не могу никак составить программу, чтобы просто узнать информацию о сетевом адаптере...

1) В блок uses добавьте файл «nb30.pas».
Код:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls,  nb30;
2) В начало программного модуля добавьте процедуру GetAdapterlnfo для получения информации о сетевом адаптере. С помощью данной процедуры для каждого найденного сетевого устройства производится получение информации при помощи команды NCD_ADPSTAT.
Код:
implementation
{$R *.dfm}
procedure GetAdapterlnfo(Lana: Char);
  var
    Adapter: TAdapterStatus;
    NCB: TNCB;
    res:string;
  begin
    FillChar(NCB, SizeOf(NCB), 0);
    //Обнуление LANA. В NetBIOS, прежде чем использовать любой  
    //  LANA, его надо обнулить. Для этого вызывается  процедура 
    // NbReset, в которой выполня¬ется NetBIOS-команду NCB_RESET
    NCB.ncb_command:= Char(NCBRESET);
    NCB.ncb_lana_num:= Lana;
    if NetBios(@NCB) <> Char(NRC_GOODRET) then
    begin
      Form1.Memo1.Lines.Add('MAC не найден.');
      Exit;
    end;
    //Получение информации об адаптере
    	FillChar(NCB, SizeOf(NCB), 0); NCB.ncb_command := сhar (NCBASTAT); 
    NCB.ncb_lana_num := Lana; 
    NCB.ncb_callname :='*';
    FillChar(Adapter, SizeOf(Adapter), 0);
    NCB.ncb_buffer := @Adapter;
    NCB.ncb_length:= SizeOf(Adapter);
    if NetBios(@NCB) <> Char(NRC_GOODRET) then
    begin
      Form1.Memo1.Lines.Add('MAC не найден.');
      Exit;
    end;

  // Формирование аппаратного адреса для вывода на экран 
    res:=
      IntToHex(Byte(Adapter.adapter_address[0]), 2) + '-' +
      IntToHex(Byte(Adapter.adapter_address[1]), 2) + '-' +
      IntToHex(Byte(Adapter.adapter_address[2]), 2) + '-' +
      IntToHex(Byte(Adapter.adapter_address[3]), 2) + '-' +
      IntToHex(Byte(Adapter.adapter_address[4]), 2) + '-' +
      IntToHex(Byte(Adapter.adapter_address[5]), 2);
      Form1.Memo1.Lines.Add('Обнаружен адаптер: ' + res);
      Form1.Memo1.Lines.Add('	Макс.размер    датаграмм:    '        +
      IntToStr(Adapter.max_dgram_size) + ' байт');
      Form1.Memo1.Lines.Add('	Макс.размер   пакета   сессии:    '       +
      IntToStr(Adapter.max_sess_pkt_size));
      Form1.Memo1.Lines.Add('           Число  имен  в  локальной  таблице:    '     + 
      IntToStr(Adapter.name_count));
      Form1.Memo1.Lines.Add('     Тайм-аут: '  + IntToStr(Adapter.ti_timeouts));
      Form1.Memo1.Lines.Add('________________________________________');
  end;
3) Добавьте процедуру GetMACAddress для получения информации о сетевых адаптерах. Так как данная процедура вызывает процедуру GetAdapterlnfo, следовательно, процедура GetMACAddress должна располагаться в программном модуле после процедуры GetAdapterlnfo. Процедура GetMACAddress получает список сетевых адаптеров и вызывает процедуру GetAdapterlnfo для вывода на экран информации об очередном сетевом адаптере.
Для получения списка всех доступных в компьютере сетевых устройств используется функция NbLanaEnum, которой соответствует NetBIOS-команда NCB_ENUM.
Код:
procedure GetMACAddress() ;
  var
    AdapterList: TLanaEnum;
    NCB: TNCB;
    i :byte;
  begin
    FillChar(NCB, SizeOf(NCB), 0);
    //Определение доступных сетевых устройств
//Заполнение структура NCB 
    NCB.ncb_command:= Char(NCBENUM);
    NCB.ncb_buffer:= @AdapterList;
    NCB.ncb_length:= SizeOf(AdapterList);
    Netbios(@NCB);
    for i:=0 to Byte(AdapterList.length)-1 do
        GetAdapterlnfo(AdapterList.lana[i]) ;
    if Byte(AdapterList.length) < 0 then
    Form1.Memo1.Lines.Add('MAC адрес не найден.');
  end;
4) Для события OnClick кнопки «Получить информацию» напишите следующий программный код:
Код:
  procedure TForm1.Button1Click(Sender: TObject);
  begin
    GetMACAddress();
  end;

опираюсь вот на этот материал, но вечно выдает, что где-то ошибки...помогите пожалуйста...


________
1) Название темы по правилам форума должно адекватно отражать суть решаемой задачи/проблемы.
На первый раз я исправил.
В последующем, темы с подобным названием будут закрываться или удаляться,
а автор такой темы будет получать штрафные баллы.


2) Код нужно оформлять по правилам:
тегом [CODE]..[/СODE] (это кнопочка с решёточкой #)

Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 26.03.2012 в 00:12.
Энджи вне форума Ответить с цитированием
Старый 26.03.2012, 00:35   #2
Энджи
Новичок
Джуниор
 
Регистрация: 25.03.2012
Сообщений: 2
По умолчанию

Прошу прощения, немного не разобралась еще с форумом..
Энджи вне форума Ответить с цитированием
Старый 26.03.2012, 14:47   #3
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Вот програмка, в ComboBox1 будут адреса ваших сетевых, выберите нужный для просмотра полной инфы, можете для себя переделать, функции описаны.
Изображения
Тип файла: jpg Lans.jpg (35.5 Кб, 227 просмотров)
Вложения
Тип файла: rar Lan.rar (177.4 Кб, 111 просмотров)

Последний раз редактировалось Aliens_wolfs; 26.03.2012 в 16:44.
Aliens_wolfs вне форума Ответить с цитированием
Старый 28.03.2012, 23:52   #4
NaumOff
Пользователь
 
Регистрация: 25.07.2011
Сообщений: 48
По умолчанию

Aliens_wolfs, в вашей программке в Win 7 не работает описание интерфейсов.
Скачал ее только чтобы посмотреть, как она выводит их названия с кириллицескими символами (типа "Контроллер Marvel...."). В принципе я использую тот же код, но кириллица выводится крякозябрами. В ХП такой проблемы не наблюдается. Наверно дело в Unicode.
Копать надо вот это:
Код:
AdapterName: array [0..MAX_ADAPTER_NAME_LENGTH + 3] of Char;
Есть идеи?
NaumOff вне форума Ответить с цитированием
Старый 29.03.2012, 09:08   #5
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

NaumOff
AdapterName вообще дает такой параметр{F03C9874-8C12-4B90-8468-D458AD6E6D94}

кодировку нужно подбирать к этой строке:
Код:
Description: array [0..MAX_ADAPTER_DESCRIPTION_LENGTH + 3] of Char;
попробуйте кодировку подобрать например в моей программке таким способом
Код:
List.Add(Utf8ToAnsi(TmpPointer^.Description));
либо другие попробуйте Dos и т.д. в интернете их много, а я не могу на Win7 проверить у меня XP

Или покажите свой кракобяз здесь на форуме я попробую подобрать кодировку

Последний раз редактировалось Aliens_wolfs; 29.03.2012 в 09:20.
Aliens_wolfs вне форума Ответить с цитированием
Старый 29.03.2012, 10:27   #6
NaumOff
Пользователь
 
Регистрация: 25.07.2011
Сообщений: 48
По умолчанию

К примеру "Љ®*ва®««Ґа Marvell Yukon 88E8056 PCI-E Gigabit Ethernet" вместо "Контроллер Marvell Yukon 88E8056 PCI-E Gigabit Ethernet". Не похоже, что дело в кодировке.
Во вложении прикрепил исходники, на основе которых я сделал подсчет траффика в своей программке. По моему в них черт ногу сломит и никогда мне в них не разобраться), но тем не менее все работает, кроме отображения кириллицы. Максимум до куда мне удалось докопаться-это заполнение структуры MIBIfArray, где уже имеются крякозябры:
Код:
procedure Get_IfTableMIB( var MIBIfArray: TMIBIfArray );
var
  i,
    Error,
    TableSize   : integer;
  pBuf          : PChar;
  NumEntries    : DWORD;
  sDescr,
    Temp        : string;
begin
  TableSize := 0;
   // first call: get memsize needed
  Error := GetIfTable( PTMibIfTable( pBuf ), @TableSize, false );
  if Error <> ERROR_INSUFFICIENT_BUFFER then
    EXIT;
  GetMem( pBuf, TableSize );

   // get table pointer
  Error := GetIfTable( PTMibIfTable( pBuf ), @TableSize, false );
  if Error = NO_ERROR then
  begin
    NumEntries := PTMibIfTable( pBuf )^.dwNumEntries;
    if NumEntries > 0 then
    begin
      SetLength( MIBIfArray, NumEntries );
      inc( pBuf, SizeOf( NumEntries ) );
      for i := 0 to pred(NumEntries) do
      begin
        MIBIfArray[i] := PTMibIfRow( pBuf )^;
        inc( pBuf, SizeOf( TMIBIfRow ) );
      end;
    end
  end;
  dec( pBuf, SizeOf( DWORD ) + NumEntries * SizeOf( TMIBIfRow ) );
  FreeMem( pBuf );
end;
Это в IpHelper.pas
Вложения
Тип файла: rar Net_traff_monitor.rar (237.2 Кб, 48 просмотров)
NaumOff вне форума Ответить с цитированием
Старый 29.03.2012, 12:42   #7
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Сейчас посмотрим
Код:
function update_dos(s:string):string;
var c:STRING;
    I:INTEGeR;
    l:byte;
    dd:char;
begin
 i:=1;
 c:='';
 while i< length(s)+1 do
 begin
   l:=ord(s[i]);
   inc(i);
   if (l>=128) and (l<=192)then l:=l+64 else
   if (l>=224) and (l<240) then l:=l+16 else
   if l=241 then l:=184 else
   if l=240 then l:=168;
   dd:=chr(l);
   c:=c+dd;
 end;
update_dos:=c;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
Showmessage(update_dos('Љ®*ва®««Ґа')); //Ваш кракобяз
end;

Последний раз редактировалось Aliens_wolfs; 29.03.2012 в 16:37.
Aliens_wolfs вне форума Ответить с цитированием
Старый 29.03.2012, 13:23   #8
NaumOff
Пользователь
 
Регистрация: 25.07.2011
Сообщений: 48
По умолчанию

Aliens_wolfs, ох, не ожидал. Низкий Вам поклон!
NaumOff вне форума Ответить с цитированием
Старый 29.03.2012, 13:43   #9
Aliens_wolfs
Форумчанин
 
Регистрация: 16.12.2009
Сообщений: 902
По умолчанию

Единственно что там нужно проверку сделать на кодировку а то в XP будет кракобяз в интернете поищите как распознать кодировку Дос и Win

В вашем проекте можно вот эту строку изменять под кодировку, туда и вставляются название сетевых
Код:
ledAdapterDescription.Text:=update_dos(Description);
И еще одно можно попробовать без кодировки просто в модуле IPHLPAPI во всех массивах замени все Char на AnsiChar.

Последний раз редактировалось Aliens_wolfs; 29.03.2012 в 15:27.
Aliens_wolfs вне форума Ответить с цитированием
Старый 29.03.2012, 17:49   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

странно, а зачем в реестре хранить инфу в 866 кодировке...
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получить информацию со стороннего ресурса Linel PHP 6 30.10.2010 18:13
Как получить информацию о БД? Belarus SQL, базы данных 1 14.07.2010 19:09
Получить информацию с сайта dimafe6 Работа с сетью в Delphi 4 03.07.2010 14:21
Получить информацию с сайта Rapala Работа с сетью в Delphi 16 13.05.2010 14:50
Получить информацию о графическом адаптере dimon_91 Общие вопросы C/C++ 1 08.12.2009 23:46