Форум: "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.035 c