Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  18:09[Войти] | [Зарегистрироваться]
Ответ на вопрос № 39384

23-01-2006 04:58
Как включить/отключить сетевую плату?, How to enable/disable network adapter?

Понадобилось в программе реальзовать фичу отключения сетевого адаптера. Начал смотреть в MSDN. Нашел возможность БЛОКИРОВКИ, а как отключать не нашел. Полез в интернет. Результаты поиска близки к нулю... Говорят, что "есть возможность отключать адаптер, но т.к. сия процедура может требовать до 5 секунд, то останавливаться на ней не будем, а рассмотрим БЛОКИРОВКУ". Ну прямо как в анекдоте: "... а ты, Ваня, слушай свою любимую песню "Валенки"!"
Короче, может кто сталкивался с такой фичей? Или может какие идеи есть?

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

16-05-2007 00:02 | Комментарий к предыдущим ответам
Здраствуйте! С отключением понятно, вот как отследить подключение/отключение PCMCIA WiFi адаптера? По WM_DEVICECHANGE всегда приходит только DBT_DEVNODES_CHANGED, и что с ним делать не совсем понятно. Может как то по другому можно узнать?

18-03-2006 11:07
»вопрос КС №29744«

31-01-2006 04:59 | Сообщение от автора вопроса
...по дефолту линковка динамическая и надо вызывать LoadSetupApi...

Так оно и есть. Линковка стоит динамическая.

Если ходить по F7 то выходило, что программа прыгает в библиотеку, и оттуда вываливает "Access violation...". Т.е. по F7 я доходил до вызова функции  SetupDiGetClassDevs, но т.к. дальше идет прямой выхов библиотечной функции то там и отваливался.

если добавить в конец проги LoadSetupApi то все работает.


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

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

begin
LoadSetupApi;
end.


31-01-2006 04:29
Неужели ни у кого нет идей почему не работает данный кусок кода?
Дело не в данном коде, а в SetupAPI.pas, изучите его перед использованием, там есть разные режимы работы, по дефолту линковка динамическая и надо вызывать LoadSetupApi или использовать статический вариант, отключив SETUPAPI_LINKONREQUEST. Вообще ответ находится мгновенно если не лениться использовать F7, да и "Access violation at address 000000." может появиться только при вызове через неинициализированную процедурную переменную.

30-01-2006 03:31 | Сообщение от автора вопроса
Неужели ни у кого нет идей почему не работает данный кусок кода? Там вроде все просто должно быть. Только под водой таки есть камешек, не котором я и встал...
Эксперты, аууу.

24-01-2006 08:10 | Сообщение от автора вопроса
Наверное вопрос глупый, но понять все равно не могу...
Падает на строке

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/default.asp?url=/library/en-us/devio/base/displaying_the_installed_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.


24-01-2006 03:00
C:\Packages\D7\JCL\jvcl\common\SetupApi.pas

строка 4435
function SetupDiGetClassDevs(ClassGuid: PGUID; const Enumerator: PTSTR;
  hwndParent: HWND; Flags: DWORD): HDEVINFO; stdcall;

24-01-2006 02:44 | Сообщение от автора вопроса
См www.delphi-jedi.org
Там уже заголовки для этого.
Качать надо http://sourceforge.net/projects/jcl/


Не, это не пойдет. Библиотека конечно удобная, сам сколько раз пользовал, только функции из setupapi.dll там не описаны, а в данном примере, на сколько я вижу, используются именно они.

24-01-2006 02:12
См www.delphi-jedi.org
Там уже заголовки для этого.
Качать надо
http://sourceforge.net/projects/jcl/

23-01-2006 10:32 | Сообщение от автора вопроса
Вроде тут есть кусок рабочего текста... Осталось только добавить определения функций и типов...
Будем разбираться.
http://groups.google.com/group/microsoft.public.vb.winapi/msg/5506e4fc859a3f86

23-01-2006 09:04
Если долго не мудрствуя, то программой DEVCON (есть на сайте MS, там же и описание ). Это консольный диспетчер устройств. Она запускается из ком. строки с параметрами.  Если без дополнительных внешних программ, то использовать SetupApi.dll. На Королевстве есть примеры. Для разобраться самостоятельно  информации вполне хватает. Удачи.

23-01-2006 07:31 | Сообщение от автора вопроса
За ссылку конечно спасибо. Теперь знаю куда копать. Тока есть одна проблема. Там используется INetConnection * pConn; а оно доступно только в XP или Vista. У меня большинство машин на W2k. Про солюшн для НТ 4 даже и не мечтаю. Но поддержка W2k нужна обязательно!

23-01-2006 05:24
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/wmi_tasks__networking.asp

См примеры на этом форуме
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=114198&SiteID=1
Приведен пример отключения всех адаптеров

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Однажды, в студеную зимнюю пору я из лесу вышел, был сильный ЧТО?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования