2012-03-29 2 views
2

Я знаю, как использовать API установки для включения и отключения устройств. Мне нужно знать, могу ли я использовать этот же API для определения того, включено или отключено устройство? Я думаю, что реальный вопрос заключается в том, как использовать его так, потому что разработчик Microsoft использует API-интерфейс Setup для управления оборудованием, и эта программа сообщит вам, включено или отключено устройство (как и диспетчер устройств). Как это делается? Мое исследование методов API установки до этого момента не дает четкого ответа.Может ли setup api использоваться, чтобы определить, включено ли устройство?

Энди

ответ

4

Этот API от MS надо быть среди наименее используется, понял и хуже документированы. Как я уже упоминал в своем первоначальном посте, API установки можно использовать для включения/отключения оборудования. Итак, я думал, что займу несколько минут, и поставлю сообщество, как я наконец выяснил, как проверить состояние аппаратного обеспечения.

Итак, короткий ответ: вы не делаете этого из API установки. Конечно, это имеет смысл. В конце концов, поскольку вы можете изменить состояние устройств, то есть включить или отключить, используя API установки: из этого следует, что вам нужно будет использовать совершенно другой API для определения текущего состояния устройства. Теперь введите API Configuration Manager 32. Чтобы включить/отключить аппаратное обеспечение, вы должны использовать API установки, но чтобы выяснить, в каком состоянии находится оборудование, вам необходимо использовать ConfigMgr 32 API (#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 для оборудования вы после этого с помощью поиска по списку найдено here. Некоторые из них, по крайней мере, предопределены в различных заголовках Windows. Однако на данный момент я знаю очень мало и только случайно наткнулся на них.

Соответствующие ссылки на функции, используемые выше: SetupDiDestroyDevieInfoList CM_Get_DevNode_Status CM_Get_Device_ID SetupDiEnumDeviceInfo SetupDiGetClassDevs SP_DEVINFO_DATA

Я надеюсь, что это поможет кому-то.

+0

Какие флаги вы используете для определения «включено» и «отключено»? Достаточно ли 'DN_STARTED'? – AlexS

+0

Прошло некоторое время с тех пор, как я работал с этим (2012). Быстрая проверка в файле заголовка (фактически cfg.h) и в памяти говорит, что да, DN_STARTED должно быть достаточно для «включено» или «отключено». В действительности, в этом контексте «включен» просто означает, что драйвер для этого устройства запущен: «отключено» означает, что это не так. –