![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Включение сетевой карты [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