|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
Как включить/отключить сетевую плату?
Понадобилось в программе реальзовать фичу отключения сетевого адаптера. Начал смотреть в Msdn. Нашел возможность БЛОКИРОВКИ, а как отключать не нашел. Полез в интернет. Результаты поиска близки к нулю... Говорят, что "есть возможность отключать адаптер, но т.к. сия процедура может требовать до 5 секунд, то останавливаться на ней не будем, а рассмотрим БЛОКИРОВКУ". Ну прямо как в анекдоте: "... а ты, Ваня, слушай свою любимую песню "Валенки"!"
Короче, может кто сталкивался с такой фичей? Или может какие идеи есть? |
#2
|
|||
|
|||
Судя по некоторым источникам (http://groups.google.com/group/micro...06e4fc859a3f86) Реализуется нижеприведенным кодом. Этот кусок максимально приближен к примеру из MSDN.
Только вот одна проблемка есть (может кто сможет сказать где собака порылась...): падает на строке Код:
hdi := SetupDiGetClassDevs(@GUID_DEVCLASS_NET, nil, 0, DIGCF_PRESENT); EAccessViolation "Access violation at address 000000. Read of address 00000." Более того, падает даже если заменить эту строчку наЭтот кусок кода взят из MSDN http://msdn.microsoft.com/library/de...ed_devices.asp) Код:
hdi := SetupDiGetClassDevs(nil, nil, 0, DIGCF_PRESENT or DIGCF_ALLCLASSES); Полный код проги: Код:
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; end. |