Diese API von MS hat bekam den am wenigsten verwendet werden, verstanden und schlimmsten dokumentiert. Wie ich in meinem ursprünglichen Beitrag erwähnt habe, kann die Setup-API zum Aktivieren/Deaktivieren von Hardware verwendet werden. Also dachte ich mir, ich würde mir ein paar Minuten Zeit nehmen und der Community mitteilen, wie ich schließlich herausgefunden habe, wie man den Hardware-Status überprüft.
Also, die kurze Antwort: Sie tun dies nicht von der Setup-API. Das macht natürlich Sinn. Schließlich können Sie den Gerätezustand, d. H. Aktivieren oder deaktivieren, mithilfe der Setup-API ändern. Daraus folgt natürlich, dass Sie eine völlig andere API verwenden müssen, um den aktuellen Status des Geräts zu bestimmen. Geben Sie nun die Configuration Manager 32-API ein. Um die Hardware zu aktivieren/deaktivieren, müssen Sie die Setup-API verwenden, aber um herauszufinden, in welchem Zustand sich die Hardware befindet, müssen Sie die API ConfigMgr 32 (#include cfgmgr32.h) verwenden. Macht Sinn, oder?
Es kann andere Wege geben, dies zu tun, aber hier ist, was ich getan habe.
#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);
Sie werden die GUID für die Hardware herauszufinden, müssen Sie nach, indem Sie durch die Liste der Suche here gefunden. Einige davon sind in verschiedenen Windows-Headern vordefiniert. Zu diesem Zeitpunkt kenne ich nur sehr wenige und bin nur zufällig auf sie gestoßen.
Relevante Links zu den oben genannten Funktionen verwendet: SetupDiDestroyDevieInfoList CM_Get_DevNode_Status CM_Get_Device_ID SetupDiEnumDeviceInfo SetupDiGetClassDevs SP_DEVINFO_DATA
Ich hoffe, das jemand hilft.
Welche Flags verwenden Sie, um "aktiviert" und "deaktiviert" zu bestimmen? Ist 'DN_STARTED' ausreichend? – AlexS
Es ist schon eine Weile her, dass ich damit gearbeitet habe (2012). Eine schnelle Überprüfung der Header-Datei (cfg.h) und des Speichers zeigt an, dass DN_STARTED für "enabled" oder "disabled" ausreichen sollte. In Wirklichkeit bedeutet in diesem Zusammenhang "aktiviert" einfach, dass der Treiber für dieses Gerät gestartet wird: "deaktiviert" bedeutet, dass dies nicht der Fall ist. –