是否可以使用 setup api 来判断设备是否已启用
Posted
技术标签:
【中文标题】是否可以使用 setup api 来判断设备是否已启用【英文标题】:Can the setup api be used to tell if a device is enabled 【发布时间】:2012-03-29 21:05:33 【问题描述】:我知道如何使用 Setup API 来启用和禁用设备。我需要知道的是,我可以使用相同的 API 来确定设备是否启用/禁用?我认为真正的问题是如何使用它,因为 Microsoft 的 devcon 使用 Setup API 来操作硬件,并且该程序会告诉您设备是启用还是禁用(设备管理器也是如此)。这是怎么做的?到目前为止,我对 Setup API 方法的研究并没有给出明确的答案。
安迪
【问题讨论】:
【参考方案1】:这个来自 MS 的 API 必须是使用最少、理解最差、记录最差的 API 之一。正如我在原始帖子中提到的,Setup API 可用于启用/禁用硬件。所以,我想我会花点时间向社区提供我最终如何检查硬件状态的方法。
所以,简短的回答是:您不能通过 Setup API 执行此操作。当然,这是有道理的。毕竟,由于您可以使用 Setup API 更改设备状态,即启用或禁用:很自然地,您必须使用完全不同的 API 来确定设备的当前状态。现在,输入 Configuration Manager 32 API。要启用/禁用硬件,您必须使用 Setup 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);
您必须通过搜索找到的here 列表找出您所追求的硬件的 GUID。其中一些,至少,是在各种 Windows 标头中预定义的。然而,在这一点上,我知道的很少,只是偶然偶然发现了它们。
上面用到的函数的相关链接: SetupDiDestroyDevieInfoList CM_Get_DevNode_Status CM_Get_Device_ID SetupDiEnumDeviceInfo SetupDiGetClassDevs SP_DEVINFO_DATA
我希望这对某人有所帮助。
【讨论】:
您使用哪些标志来确定“启用”和“禁用”?DN_STARTED
足够了吗?
我已经有一段时间没有使用这个了(2012 年)。快速检查头文件(实际上是cfg.h)和内存说,是的,DN_STARTED 对于“启用”或“禁用”应该足够了。实际上,在这种情况下,“启用”仅表示该设备的驱动程序已启动:“禁用”表示未启动。以上是关于是否可以使用 setup api 来判断设备是否已启用的主要内容,如果未能解决你的问题,请参考以下文章
是否有任何API可以检查WiFi是否已连接到Internet?