Можно ли использовать настройки API, чтобы узнать, включено ли устройство
Я знаю, как использовать API настройки для включения и отключения устройств. Что мне нужно знать, так это то, могу ли я использовать этот же API, чтобы определить, включено ли устройство или нет? Я думаю, что реальный вопрос заключается в том, как использовать его таким образом, потому что devcon от Microsoft использует API-интерфейс установки для манипулирования оборудованием, и эта программа сообщит вам, включено ли устройство или нет (как это делает диспетчер устройств). Как это сделать? Мои исследования методов установки API на данный момент не дают однозначного ответа.
Энди
1 ответ
Этот API от MS должен быть одним из наименее используемых, понятых и плохо документированных. Как я уже упоминал в своем первоначальном посте, API-интерфейс установки можно использовать для включения / отключения оборудования. Итак, я подумал, что смогу потратить несколько минут и рассказать сообществу, как я наконец понял, как проверить состояние оборудования.
Итак, краткий ответ: вы не делаете это из Setup API. Конечно, это имеет смысл. В конце концов, поскольку вы можете изменить состояние устройства, то есть включить или отключить его, используя API настройки: из этого следует, что вам придется использовать совершенно другой API для определения текущего состояния устройства. Теперь введите API-интерфейс Configuration Manager 32. Чтобы включить / отключить аппаратное обеспечение, вы должны использовать API настройки, но чтобы выяснить, в каком состоянии находится аппаратное обеспечение, вы должны использовать API ConfigMgr 32 (#include cfgmgr32.h). Имеет смысл, верно?
Могут быть и другие способы сделать это, но вот что я сделал.
#include <Windows.h>
#include <cstdlib>
#include <setupapi.h>
#include <cfgmgr32.h>
GUID driveGuid = {0x4d36e967, 0xe325, 0x11ce, {0xbf, 0xc1, 0x08, 0x00, 0x2b, 0xe1, 0x03, 0x18}};
// first, get a list of hardware you're interested in using Setup API
HDEVINFO hDevs(SetupDiGetClassDevs(&driveGuid, NULL, NULL, DIGCF_PRESENT));
if(INVALID_HANDLE_VALUE == hDevs)
{
throw std::runtime_error("unable to build a list of hardware");
}
// this struct has the dev instance ID that the CFG MGR API wants. The struct must be
// must be inited to the size of the struct, the cbSize member, all others should be 0
SP_DEVINFO_DATA devInfo = {sizeof(SP_DEVINFO_DATA)};
DWORD index(0);
LONG devStatus(0), devProblemCode(0);
char devId[256];
memset(devId, 0, 256)
while(SetupDiEnumDeviceInfo(hDevs, index++, &devInfo))
{
// use Config Mgr to get a nice string to compare against
CM_Get_Device_ID(devInfo.DevInst, devId, 256, 0);
// use whatever mechanism you like to search the string to find out
// if it's the hardware you're after
if((std::string(devId)).find("MyHardware") != std::string::npos)
{
// goody, it's the hardware we're looking for
CM_Get_DevNode_Status(&devStatus, &devProblemCode, devInfo.DevInst, 0);
// if the call to getting the status code was successful, do something
// meaningful with the data returned. The fun part of this is that the
// return codes aren't really documented on MSDN. You'll have to look
// through the CfgMgr32.h file. Incidentally, these values are what
// are shown in the Device Manager when you look at the device's status.
}
}
SetupDiDestroyDeviceInfoList(hDevs);
Вы должны выяснить GUID для оборудования, которое вы ищете, просматривая список, найденный здесь. Некоторые из них, по крайней мере, предопределены в различных заголовках Windows. Однако на данный момент я знаю очень мало и наткнулся на них случайно.
Соответствующие ссылки на функции, используемые выше: SetupDiDestroyDevieInfoList CM_Get_DevNode_Status CM_Get_Device_ID SetupDiEnumDeviceInfo SetupDiGetClassDevs SP_DEVINFO_DATA
Я надеюсь, что это помогает кому-то.