//---------------------------------------------------------------------------
bool __fastcall TForm1::enable_adapter(bool enable)
{
HDEVINFO Devs=INVALID_HANDLE_VALUE;
wchar_t * CLASSID_NetworkAdapter = L"{4d36e972-e325-11ce-bfc1-08002be10318}";
GUID guid;
CLSIDFromString(CLASSID_NetworkAdapter, &guid);
Devs = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_PRESENT);
if (Devs == INVALID_HANDLE_VALUE) goto failed;
SP_DEVINFO_DATA devInfo;
devInfo.cbSize = sizeof(SP_DEVINFO_DATA);
if (!SetupDiEnumDeviceInfo(Devs, 0, &devInfo)) goto failed;
else // имя
{
char buff[256];
DWORD lenbuff;
SetupDiGetDeviceRegistryProperty(Devs, &devInfo, SPDRP_SERVICE, NULL, (byte *)buff, 256, &lenbuff);
LabelResult->Caption = "device: "+(AnsiString) buff ;
}
SP_PROPCHANGE_PARAMS pcp;
if(enable){
pcp.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
pcp.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
pcp.StateChange = enable ? DICS_ENABLE : DICS_DISABLE;
pcp.Scope = DICS_FLAG_GLOBAL;
pcp.HwProfile = 0;
if (SetupDiSetClassInstallParams(Devs, &devInfo, &pcp.ClassInstallHeader, sizeof(pcp)))
SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, Devs, &devInfo);
}
pcp.ClassInstallHeader.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
pcp.ClassInstallHeader.InstallFunction = DIF_PROPERTYCHANGE;
pcp.StateChange = enable ? DICS_ENABLE : DICS_DISABLE;
pcp.Scope = DICS_FLAG_CONFIGSPECIFIC;
pcp.HwProfile = 0;
if(!SetupDiSetClassInstallParams(Devs,&devInfo,&pcp.ClassInstallHeader,sizeof(pcp)) ||
!SetupDiCallClassInstaller(DIF_PROPERTYCHANGE,Devs,&devInfo))
// failed to invoke DIF_PROPERTYCHANGE
goto failed;
SP_DEVINSTALL_PARAMS devParams;
devParams.cbSize = sizeof(devParams);
if(SetupDiGetDeviceInstallParams(Devs,&devInfo,&devParams) && (devParams.Flags & (DI_NEEDRESTART|DI_NEEDREBOOT))){
// see if device needs reboot
ShowMessage("see if device needs reboot");
goto failed;
}
//else ;// appears to have succeeded
LabelResult->Caption = LabelResult->Caption +" - "+IntToStr(enable) ;
//enable ? " enabled!" : " disabled!";
SetupDiDestroyDeviceInfoList(Devs);
return true;
failed:
SetupDiDestroyDeviceInfoList(Devs);
return false;
}
//---------------------------------------------------------------------------
Подключение по локальной сети
Пишу собственную программу по удаленному администрированию. Вот и столкнулся с такой проблемой: нужной отслеживать подключение по локальной сети, т.е. проверять включено оно или нет, если выключено, то надо как-то программно включить. Видел, что при отключении в диспетчере устройств состояние сетевой карты принимает вид: Устройство отключено. (Код 22), как я понял, останавливается драйвер (все перепробовал, так его программно и не запустил). За ранее благодарен хоть за какой-нибудь намек по этой теме.
Программка вначале вырубает сетевушку(она должна быть включена), ждет 10 секунд, потом запускает ее заново.:)))
Есть один глюк - если сетевая изначально выключена - почему-то таким способом ее не включить(ошибок в коде вроде нет, и при работе прожки ошибки не появляются - все функции вызываются и возвращают нормальные результаты)...
Уважаемые гуру программирования!:))) может быть вы знаете в чем дело?
вот так работает в билдере ;)
Цитата: ШпиЁн
Есть один глюк - если сетевая изначально выключена - почему-то таким способом ее не включить(ошибок в коде вроде нет, и при работе прожки ошибки не появляются - все функции вызываются и возвращают нормальные результаты)...
Уважаемые гуру программирования!:))) может быть вы знаете в чем дело?
Так решение найдено или нет. Меня это сильно интересует.
Что бы обрабатывалось нужное устройство, тогда надо зделать так
Devs = SetupDiGetClassDevs(NULL, cPNPid, NULL, DIGCF_ALLCLASSES);
где cPNPid - id устройства в системе, вроде этого PCI\VEN_10EC&DEV_8139&SUBSYS_813910EC&REV_10