Наши преимущества

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

E

EagleNN

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

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

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

Нет, это не то. Эти функции для работы на самом высоком уровне. Т.е. для работы с ресурсами типа шарок.
Я, в принципе, нашел чем надо пользоваться... Как увидеть ссылки? | How to see hidden links?

Написал паскальный код. Только проблема в том, что он валится после вызова первой API функции. (enumerate сетевых адаптеров). В чем фишка - так и не разобрался. (исходник с комментариями тут Как увидеть ссылки? | How to see hidden links?)

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

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

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

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