Как выключить/включить сетевой адаптер из программы

EagleNN

Местный
Регистрация
12 Дек 2003
Сообщения
55
Реакции
16
Credits
102
Надо по запросу пользователя выключать/включать определенный сетевой интерфейс (фактически Disable/Enable на сетевую карту).

Знаю способ блокировки интерфейса через функцию SetIfEntry с параметром MIB_IF_ADMIN_STATUS_DOWN. Но она не отключает интерфейс, а только блокирует.

По MSDN так и не нашел, как это делать. Ну ведь должен же быть такой способ! Помогите, pls.
 

EagleNN

Местный
Регистрация
12 Дек 2003
Сообщения
55
Реакции
16
Credits
102
shreder написал(а):
Это не то?
Windows Networking Functions
Для просмотра ссылки Войди или Зарегистрируйся

Нет, это не то. Эти функции для работы на самом высоком уровне. Т.е. для работы с ресурсами типа шарок.
Я, в принципе, нашел чем надо пользоваться... Для просмотра ссылки Войди или Зарегистрируйся

Написал паскальный код. Только проблема в том, что он валится после вызова первой API функции. (enumerate сетевых адаптеров). В чем фишка - так и не разобрался. (исходник с комментариями тут Для просмотра ссылки Войди или Зарегистрируйся)

Может кто разберется в чем трабла?
 
V

vector4u

EagleNN написал(а):
Надо по запросу пользователя выключать/включать определенный сетевой интерфейс (фактически Disable/Enable на сетевую карту).

Знаю способ блокировки интерфейса через функцию SetIfEntry с параметром MIB_IF_ADMIN_STATUS_DOWN. Но она не отключает интерфейс, а только блокирует.

По MSDN так и не нашел, как это делать. Ну ведь должен же быть такой способ! Помогите, pls.

Не знаю решыл-ли ты свой вопрос, но могу тебе дать направление где искать,
по msdn ищи NETSH или netsh.h.
Посмотрeл по PLatform SDK Collection for 2003 там много примеров, или можешь посмотреть функциональность через CMD>netsh help.
 

EagleNN

Местный
Регистрация
12 Дек 2003
Сообщения
55
Реакции
16
Credits
102
Большое спасибо. Вопрос уже решен. Проблема с исходным кодом была в том, что перед вызовом функций, я забыл их динамически связать с адресами загруженной DLL... :mad:

Привожу рабочий код программы (вдруг кому еще понадобится):

Код:
unit Unit1;

interface

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

const
  GUID_DEVCLASS_NET: TGUID = '{4D36E972-E325-11CE-BFC1-08002BE10318}';

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

var
  Form1: TForm1;

implementation

{$R *.dfm}

function StateChange(NewState, SelectedItem: cardinal; hDevInfo:
HDEVINFO): boolean;
var
  PropChangeParams:    SP_PROPCHANGE_PARAMS;
  DeviceInfoData:      SP_DEVINFO_DATA;
begin
  DeviceInfoData.cbSize := SizeOf(SP_DEVINFO_DATA);

  // Get handle to selected item
  if not SetupDiEnumDeviceInfo(hDevInfo, SelectedItem, DeviceInfoData)
then
  begin
    Result := False;
    Exit;
  end;

  // Set the PropChangeParams structure for this item
  PropChangeParams.ClassInstallHeader.InstallFunction :=DIF_PROPERTYCHANGE;
  PropChangeParams.ClassInstallHeader.cbSize :=SizeOf(SP_CLASSINSTALL_HEADER);
  PropChangeParams.Scope := DICS_FLAG_GLOBAL;
  PropChangeParams.StateChange := NewState;

  if not SetupDiSetClassInstallParams(hDevInfo, @DeviceInfoData,
PSPCLASSINSTALLHEADER(@PropChangeParams), SizeOf(PropChangeParams)) then
  begin
    Result := False;
    Exit;
  end;

  // Call the ClassInstaller and perform the change
  if not SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, @DeviceInfoData) then
  begin
    Result := False;
    Exit;
  end;

  Result := True;
end;

function DisableNetAdapter: boolean;
var
  hdi:  HDEVINFO;
begin
  hdi := SetupDiGetClassDevs(@GUID_DEVCLASS_NET, nil, 0, DIGCF_PRESENT);

  if cardinal(hdi) = INVALID_HANDLE_VALUE then
  begin
    Result := False;
  end
  else
  begin
    Result := StateChange(DICS_DISABLE, 0, hdi);
    SetupDiDestroyDeviceInfoList(hdi);
  end;
end;

function EnableNetAdapter: boolean;
var
  hdi:  HDEVINFO;
begin                                    
  hdi := SetupDiGetClassDevs(@GUID_DEVCLASS_NET, nil, 0, DIGCF_PRESENT);

  if cardinal(hdi) = INVALID_HANDLE_VALUE then
  begin
    Result := False;
  end
  else
  begin
    Result := StateChange(DICS_ENABLE, 0, hdi);
    SetupDiDestroyDeviceInfoList(hdi);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  EnableNetAdapter;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  DisableNetAdapter;
end;

begin
LoadSetupApi;
end.