Мне нужно программно удалить все устройства Com порта. Проблема в том, что эти устройства Com Port отсутствуют и поэтому полностью скрыты. Это означает, что даже если вы хотите удалить их с помощью диспетчера устройств, сначала вы должны добавить devmgr_show_nonpresent_devices = 1
переменные среды, а затем показать скрытые устройства в диспетчере устройств. Затем вы можете щелкнуть правой кнопкой мыши каждое устройство и удалить. Я не хочу, чтобы удалить связанный драйвер, хотя. Я добавляю эту переменную в дополнительных системных настройках, создавая и сохраняя новую пользовательскую переменную.
Я пытаюсь сделать это с Devcon. Их можно найти с devcon findall
но я не могу удалить их, потому что команда удалить они терпят неудачу, заявляя, что ни одно устройство не было удалено. Кроме того, нет флага, чтобы он смотрел на отсутствующие устройства. Если я сделаю стандарт devcon find
Устройства не найдены (интересны).
Итак, я снова вынужден выяснить, как именно это сделать, используя мой собственный код, и вот где я застрял. Вот что у меня так далеко:
// Get all of the devices
PCTSTR enumType = "PORTS";
HDEVINFO devs = NULL;
devs = SetupDiGetClassDevs(NULL,enumType,0,DIGCF_PRESENT | DIGCF_ALLCLASSES);
// Loop through the devices
DWORD devCount = 0;
SP_DEVINFO_DATA devInfo;
int enumeratingDevices = 1;
devInfo.cbSize = sizeof(SP_DEVINFO_DATA);
while(enumeratingDevices){
enumeratingDevices = SetupDiEnumDeviceInfo (devs,devCount,&devInfo);
// Uninstall each device
cout << SetupDiRemoveDevice(devs,&devInfo);
cout << SetupDiCallClassInstaller(DIF_REMOVE,&devInfo,NULL);
devCount++;
}
cout << devCount;
SetupDiDestroyDeviceInfoList(devs);
return 0;
Прямо сейчас я получаю вывод 001
, Итак, в основном, SetupDiEnumDeviceInfo()
или жеSetupDiRemoveDevice
не работает правильно. Я знаю, что перечисление работает, потому что если я положу в enumType = "USB";
Я получаю десять за devCount.
Любая помощь или совет будут великолепны.
Итак, я разобрался с этим после долгих экспериментов и чтения.
// Get all of the devices
//This enumeration does not work in general, instead passing
//complete id of the device is probably best.
//It is helpful to know the vendor and device ID
PCTSTR enumType = "PORTS";
HDEVINFO devs = NULL;
devs = SetupDiGetClassDevs(NULL,enumType,0,DIGCF_ALLCLASSES);
// Loop through the devices
DWORD devCount = 0;
SP_DEVINFO_DATA devInfo;
int enumeratingDevices = 1;
/*This line is essential*/
devInfo.cbSize = sizeof(SP_DEVINFO_DATA);
while(enumeratingDevices){
enumeratingDevices = SetupDiEnumDeviceInfo (devs,devCount,&devInfo);
// Uninstall each device
if(enumeratingDevices){
SetupDiRemoveDevice(devs,&devInfo);
devCount++;
}
}
//Clean up
SetupDiDestroyDeviceInfoList(devs);
Я обновлю это завтра, когда доберусь до лаборатории с точным перечислением, о котором я говорил. Тем не менее, с помощью этого метода вы можете удалить практически любое устройство, даже если оно отсутствует и просто «призрак» в реестре.
Других решений пока нет …