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

EagleNN

Member
Joined
Dec 11, 2003
Messages
55
Reaction score
16
Age
43
Location
Russia, N.Novgorod
Надо по запросу пользователя выключать/включать определенный сетевой интерфейс (фактически Disable/Enable на сетевую карту).

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

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

EagleNN

Member
Joined
Dec 11, 2003
Messages
55
Reaction score
16
Age
43
Location
Russia, N.Novgorod
shreder said:

Нет, это не то. Эти функции для работы на самом высоком уровне. Т.е. для работы с ресурсами типа шарок.
Я, в принципе, нашел чем надо пользоваться... http://groups.google.com/group/microsoft.public.vb.winapi/msg/5506e4fc859a3f86

Написал паскальный код. Только проблема в том, что он валится после вызова первой API функции. (enumerate сетевых адаптеров). В чем фишка - так и не разобрался. (исходник с комментариями тут http://www.delphikingdom.com/asp/answer.asp?IDAnswer=39384)

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

vector4u

New member
Joined
Feb 13, 2006
Messages
1
Reaction score
0
Age
44
Location
DE
EagleNN said:
Надо по запросу пользователя выключать/включать определенный сетевой интерфейс (фактически Disable/Enable на сетевую карту).

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

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

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

EagleNN

Member
Joined
Dec 11, 2003
Messages
55
Reaction score
16
Age
43
Location
Russia, N.Novgorod
Большое спасибо. Вопрос уже решен. Проблема с исходным кодом была в том, что перед вызовом функций, я забыл их динамически связать с адресами загруженной DLL... :mad:

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

Code:
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.
 
Top