Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.09.26;
Скачать: CL | DM;

Вниз

Включение сетевой карты   Найти похожие ветки 

 
midavik ©   (2004-08-13 12:48) [0]

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


 
VMcL ©   (2004-08-13 13:03) [1]

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


 
midavik ©   (2004-08-13 15:40) [2]

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


 
simpson ©   (2004-08-13 16:23) [3]

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


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

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


 
simpson ©   (2004-08-16 10:46) [5]

Пожалуйста. Форма, две кнопки. Нажимаешь на 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.


 
simpson ©   (2004-08-16 10:47) [6]

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

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.


 
midavik ©   (2004-08-16 10:55) [7]

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



Страницы: 1 вся ветка

Текущий архив: 2004.09.26;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.027 c
4-1092397878
Сергей В. М.
2004-08-13 15:51
2004.09.26
Извенить текст StatusBar a в чужом приложении.


1-1094992980
Vulko
2004-09-12 16:43
2004.09.26
Как определить время выполнения подпрограммы?


1-1094046629
Heretic
2004-09-01 17:50
2004.09.26
Регистрация Ehlib


6-1090066678
8ung
2004-07-17 16:17
2004.09.26
CGI приложение


3-1093424056
IGray
2004-08-25 12:54
2004.09.26
Посоветуйте плиз DBGrid с мультиселектом и сортировкой