Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "WinAPI";
Текущий архив: 2004.09.26;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.032 c
14-1094465615
SammIk
2004-09-06 14:13
2004.09.26
Какая-то странныя картинка в правом верхнем углу.


14-1094635405
Vasya.ru
2004-09-08 13:23
2004.09.26
Седня препод дал на паре - написать календарь


6-1090423280
AlexeyM
2004-07-21 19:21
2004.09.26
ras api


14-1094236585
Владислав
2004-09-03 22:36
2004.09.26
Вопрос.


4-1092727347
BiN
2004-08-17 11:22
2004.09.26
Перенаправление вывода с десктопа Default на произвольное DC





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский