Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Включение сетевой карты [D6, WinXP]


midavik ©   (2004-08-13 12:48:00) 

Как в WinXP программно включить/выключить сетевую карту.
Нашел что вроде надо вызывать из ...\system32\setupapi.dll функцию SetupDiChangeState, а как именно и с какими параметрами?


midavik   (2004-08-16 10:55:00) [1]

> simpson
Огромное спасибо! Буду разбираться.


simpson   (2004-08-16 10:47:00) [2]

Его использование:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ComCtrls;

type
 TForm1 = class(TForm)
   ifTree: TTreeView;
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure ifTreeDeletion(Sender: TObject; Node: TTreeNode);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

uses IPHelper;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
 dwSize, dwErrorCode, I: Cardinal;
 pIfTable: PMIB_IFTABLE;
 currentRow: MIB_IFROW;
 pRowData: PMIB_IFROW;
 Node, NodeIn, NodeOut: TTreeNode;
begin
 // обновляем список сетевых интерфейсов компьютера, для этого сначала
 // определяем размер буфера данных, необходимого для хранения информации
 // о сетевых интерфейсах
 GetIfTable(nil, @dwSize, True);
 // выделяем необходимый блок памяти
 GetMem(pIfTable, dwSize);
 try
   GetMem(pIfTable^.table, dwSize);
   try
     dwErrorCode := GetIfTable(pIfTable, @dwSize, True);
     if dwErrorCode <> NO_ERROR then
       raise Exception.CreateFmt('Ошибка во время вызова GetIfTable. Код ошибки: %d',
         [dwErrorCode]);
     // помещаем сведения о сетевых интерфейсах в дерево
     for I := 1 to pIfTable^.dwNumEntries do
       begin
         currentRow := GetIfRow(pIfTable, I - 1);
         Node := ifTree.Items.AddChild(nil, StrPas(@currentRow.bDescr));
         New(pRowData);
         pRowData^ := currentRow;
         Node.Data := pRowData;
         ifTree.Items.AddChild(Node,
           Format('Тип: %s', [IfTypeToStr(currentRow)]));
         if currentRow.dwSpeed < 1000000 then
           ifTree.Items.AddChild(Node, Format('Скорость подключения, бит/с.: %d',
             [currentRow.dwSpeed]))
         else
           ifTree.Items.AddChild(Node, Format('Скорость подключения, Мбит/с.: %d',
             [currentRow.dwSpeed div 1000000]));
         ifTree.Items.AddChild(Node, Format('MAC-адрес: %s',
           [GetHardwareAddress(currentRow)]));
         ifTree.Items.AddChild(Node, Format('Административный статус: %s',
           [GetAdminStatus(currentRow)]));
         ifTree.Items.AddChild(Node, Format('Оперативный статус: %s',
           [GetOperStatus(currentRow)]));

         NodeIn := ifTree.Items.AddChild(Node, 'Входящий трафик');
         if currentRow.dwInOctets < 1048576 then
           ifTree.Items.AddChild(NodeIn, Format('Получено, байт: %d',
             [currentRow.dwInOctets]))
         else
           ifTree.Items.AddChild(NodeIn, Format('Получено, Мбайт: %d',
             [currentRow.dwInOctets div 1048576]));
         ifTree.Items.AddChild(NodeIn, Format('Пакетов отклонено: %d',
           [currentRow.dwInDiscards]));
         ifTree.Items.AddChild(NodeIn, Format('Ошибочных пакетов: %d',
           [currentRow.dwInErrors]));
         ifTree.Items.AddChild(NodeIn, Format('Пакетов, полученных по неизвестным протоколам: %d',
           [currentRow.dwInUnknownProtos]));

         NodeOut := ifTree.Items.AddChild(Node, 'Исходящий трафик');
         if currentRow.dwOutOctets < 1048576 then
           ifTree.Items.AddChild(NodeOut, Format('Отправлено, байт: %d',
             [currentRow.dwOutOctets]))
         else
           ifTree.Items.AddChild(NodeOut, Format('Отправлено, Мбайт: %d',
             [currentRow.dwOutOctets div 1048576]));
         ifTree.Items.AddChild(NodeOut, Format('Пакетов отклонено: %d',
           [currentRow.dwOutDiscards]));
         ifTree.Items.AddChild(NodeOut, Format('Ошибочных пакетов: %d',
           [currentRow.dwOutErrors]));
         ifTree.Items.AddChild(NodeOut, Format('Байт в очереди к отправке: %d',
           [currentRow.dwOutQLen]));
         Node.Expand(False);
       end;
   finally
     FreeMem(pIfTable^.table, dwSize);
   end;
 finally
   FreeMem(pIfTable, dwSize);
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 if (ifTree.Selected = nil) or (ifTree.Selected.Level > 0) then
   begin
     ShowMessage('Не выбран сетевой интерфейс!');
     Exit;
   end;
 // меняем административный статус интерфейса (включаем-выключаем)
 if PMIB_IFROW(ifTree.Selected.Data)^.dwAdminStatus = MIB_IF_ADMIN_STATUS_UP then
   PMIB_IFROW(ifTree.Selected.Data)^.dwAdminStatus := MIB_IF_ADMIN_STATUS_DOWN
 else
   PMIB_IFROW(ifTree.Selected.Data)^.dwAdminStatus := MIB_IF_ADMIN_STATUS_UP;
 if SetIfEntry(ifTree.Selected.Data) <> NO_ERROR then
   ShowMessage('Не удалось изменить адм. статус сетевого интерфейса!')
 else
   ShowMessage('Адм. статут изменен.')
end;

procedure TForm1.ifTreeDeletion(Sender: TObject; Node: TTreeNode);
begin
 if Node.Data <> nil then Dispose(Node.Data);
end;

end.


simpson   (2004-08-16 10:46:00) [3]

Пожалуйста. Форма, две кнопки. Нажимаешь на Button1 - в ifTree (TTreeView) попадают сведения о всех сетевых интерфейсах. Выбираешь интерфейс в дереве, нажимаешь Button2 - и можно переключать статус интерфейса, т. е. включать или выключать. Написано под D7, XP.

Вспомогательный юнит:

unit IPHelper;

interface

const
 NO_ERROR = 0;
 { наименование используемой библиотеки }
 Iphlpapi = 'Iphlpapi.dll';
 { максимальная длина имени сетевого интерфейса }
 MAX_INTERFACE_NAME_LEN = 256;
 { максимальная длина MAC-адреса }
 MAXLEN_PHYSADDR = 8;
 { максимальная длина описания сетевого интерфейса }
 MAXLEN_IFDESCR = 256;
 { типы сетевых интефейсов }
 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;
 { оперативный статус интерфейса }
 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;

type
 PMIB_IFROW = ^MIB_IFROW;
 MIB_IFROW = record
   wszName: array [1..MAX_INTERFACE_NAME_LEN] of WideChar;
   dwIndex: Cardinal;
   dwType: Cardinal;
   dwMtu: Cardinal;
   dwSpeed: Cardinal;
   dwPhysAddrLen: Cardinal;
   bPhysAddr: array [1..MAXLEN_PHYSADDR] of Byte;
   dwAdminStatus: Cardinal;
   dwOperStatus: Cardinal;
   dwLastChange: Cardinal;
   dwInOctets: Cardinal;
   dwInUcastPkts: Cardinal;
   dwInNUcastPkts: Cardinal;
   dwInDiscards: Cardinal;
   dwInErrors: Cardinal;
   dwInUnknownProtos: Cardinal;
   dwOutOctets: Cardinal;
   dwOutUcastPkts: Cardinal;
   dwOutNUcastPkts: Cardinal;
   dwOutDiscards: Cardinal;
   dwOutErrors: Cardinal;
   dwOutQLen: Cardinal;
   dwDescrLen: Cardinal;
   bDescr: array [1..MAXLEN_IFDESCR] of Byte;
 end;

 PMIB_IFTABLE = ^MIB_IFTABLE;
 MIB_IFTABLE = record
   dwNumEntries: Cardinal;
   table: PMIB_IFROW;
 end;

{$EXTERNALSYM GetIfTable}
function GetIfTable(pIfTable: PMIB_IFTABLE; pdwSize: PCardinal;
 bOrder: LongBool): Cardinal; stdcall;

{$EXTERNALSYM SetIfEntry}
function SetIfEntry(pIfRow: PMIB_IFROW): Cardinal; stdcall;

function GetIfRow(pIfTable: PMIB_IFTABLE; const dwIndex: Cardinal): MIB_IFROW;
function IfTypeToStr(IfRow: MIB_IFROW): String;
function GetHardwareAddress(IfRow: MIB_IFROW): String;
function GetAdminStatus(IfRow: MIB_IFROW): String;
function GetOperStatus(IfRow: MIB_IFROW): String;

implementation

uses SysUtils;

function GetIfTable(pIfTable: PMIB_IFTABLE; pdwSize: PCardinal;
 bOrder: LongBool): Cardinal; external Iphlpapi name 'GetIfTable';
function SetIfEntry(pIfRow: PMIB_IFROW): Cardinal;
 external Iphlpapi name 'SetIfEntry';

function GetIfRow(pIfTable: PMIB_IFTABLE; const dwIndex: Cardinal): MIB_IFROW;
begin
 Result := PMIB_IFROW(Cardinal(pIfTable) + SizeOf(Cardinal) + dwIndex * SizeOf(MIB_IFROW))^;
end;

function IfTypeToStr(IfRow: MIB_IFROW): String;
begin
 case IfRow.dwType of
   MIB_IF_TYPE_ETHERNET: Result := 'Ethernet';
   MIB_IF_TYPE_TOKENRING: Result := 'Token ring';
   MIB_IF_TYPE_FDDI: Result := 'FDDI';
   MIB_IF_TYPE_PPP: Result := 'PPP';
   MIB_IF_TYPE_LOOPBACK: Result := 'Замыкание на себя';
   MIB_IF_TYPE_SLIP: Result := 'Подключение к UNIX';
 else
   Result := 'Нейзвестный тип';
 end;
end;

function GetHardwareAddress(IfRow: MIB_IFROW): String;
var
 I: Byte;
begin
 Result := '';
 for I := 1 to MAXLEN_PHYSADDR do
   if I < MAXLEN_PHYSADDR then
     Result := Result + IntToHex(IfRow.bPhysAddr[I], 2) + '-'
   else
     Result := Result + IntToHex(IfRow.bPhysAddr[I], 2);
end;

function GetAdminStatus(IfRow: MIB_IFROW): String;
begin
 case IfRow.dwAdminStatus of
   MIB_IF_ADMIN_STATUS_UP: Result := 'Включен';
   MIB_IF_ADMIN_STATUS_DOWN: Result := 'Выключен';
 else
   Result := 'Проверка';
 end;
end;

function GetOperStatus(IfRow: MIB_IFROW): String;
begin
 case IfRow.dwOperStatus of
   MIB_IF_OPER_STATUS_NON_OPERATIONAL: Result := 'LAN-адаптер отключен';
   MIB_IF_OPER_STATUS_UNREACHABLE: Result := 'WAN-адаптер отключен';
   MIB_IF_OPER_STATUS_DISCONNECTED: Result := 'LAN-кабель отключен или нет сигнала';
   MIB_IF_OPER_STATUS_CONNECTING: Result := 'WAN-адаптер в процессе подключения';
   MIB_IF_OPER_STATUS_CONNECTED: Result := 'WAN-адаптер установил соединение';
 else
   Result := 'LAN-адаптер подключен';
 end;
end;

end.


midavik   (2004-08-16 10:15:00) [4]

а нет ли у кого примерчика? А то честно говоря непонятно.


simpson   (2004-08-13 16:23:00) [5]

см. описание GetIfTable, GetIfRow, SetIfEntry, MIB_IFROW, MIB_IFTABLE


midavik   (2004-08-13 15:40:00) [6]

> VMcL
Спасибо конечно за ссылку но я там уже был. В том то и проблема что не могу разобраться. Там надо составить хэндл к device information set и DeviceInfoData а как непонятно. Буду благорарен за подсказку.


VMcL   (2004-08-13 13:03:00) [7]

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/install/hh/install/di-rtns_0749286d-9e78-4e2a-8bbf-483d698753ba.xml.asp


Наверх

Титульная страница Поиск, карта сайта Написать письмо