Можно ли использовать настройки API, чтобы узнать, включено ли устройство - PullRequest
3 голосов
/ 30 марта 2012

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

Andy

1 Ответ

5 голосов
/ 28 октября 2012

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

Итак, короткий ответ: вы не делаете это из 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

Надеюсь, это кому-нибудь поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...