Как включить/отключить сетевую плату?, How to enable/disable network adapter?
Понадобилось в программе реальзовать фичу отключения сетевого адаптера. Начал смотреть в MSDN. Нашел возможность БЛОКИРОВКИ, а как отключать не нашел. Полез в интернет. Результаты поиска близки к нулю... Говорят, что "есть возможность отключать адаптер, но т.к. сия процедура может требовать до 5 секунд, то останавливаться на ней не будем, а рассмотрим БЛОКИРОВКУ". Ну прямо как в анекдоте: "... а ты, Ваня, слушай свою любимую песню "Валенки"!"
Короче, может кто сталкивался с такой фичей? Или может какие идеи есть?
Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице. Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.
16-05-2007 00:02 | Комментарий к предыдущим ответам
Здраствуйте! С отключением понятно, вот как отследить подключение/отключение PCMCIA WiFi адаптера? По WM_DEVICECHANGE всегда приходит только DBT_DEVNODES_CHANGED, и что с ним делать не совсем понятно. Может как то по другому можно узнать?
...по дефолту линковка динамическая и надо вызывать LoadSetupApi...
Так оно и есть. Линковка стоит динамическая.
Если ходить по F7 то выходило, что программа прыгает в библиотеку, и оттуда вываливает "Access violation...". Т.е. по F7 я доходил до вызова функции SetupDiGetClassDevs, но т.к. дальше идет прямой выхов библиотечной функции то там и отваливался.
если добавить в конец проги LoadSetupApi то все работает.
procedure TForm1.Button1Click(Sender: TObject);
begin
EnableNetAdapter;
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
DisableNetAdapter;
end;
Неужели ни у кого нет идей почему не работает данный кусок кода?
Дело не в данном коде, а в SetupAPI.pas, изучите его перед использованием, там есть разные режимы работы, по дефолту линковка динамическая и надо вызывать LoadSetupApi или использовать статический вариант, отключив SETUPAPI_LINKONREQUEST. Вообще ответ находится мгновенно если не лениться использовать F7, да и "Access violation at address 000000." может появиться только при вызове через неинициализированную процедурную переменную.
Неужели ни у кого нет идей почему не работает данный кусок кода? Там вроде все просто должно быть. Только под водой таки есть камешек, не котором я и встал...
Эксперты, аууу.
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;
Не, это не пойдет. Библиотека конечно удобная, сам сколько раз пользовал, только функции из setupapi.dll там не описаны, а в данном примере, на сколько я вижу, используются именно они.
Если долго не мудрствуя, то программой DEVCON (есть на сайте MS, там же и описание ). Это консольный диспетчер устройств. Она запускается из ком. строки с параметрами. Если без дополнительных внешних программ, то использовать SetupApi.dll. На Королевстве есть примеры. Для разобраться самостоятельно информации вполне хватает. Удачи.
За ссылку конечно спасибо. Теперь знаю куда копать. Тока есть одна проблема. Там используется INetConnection * pConn; а оно доступно только в XP или Vista. У меня большинство машин на W2k. Про солюшн для НТ 4 даже и не мечтаю. Но поддержка W2k нужна обязательно!
Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter. Функция может не работать в некоторых версиях броузеров.