Получить набор информации об устройстве для мониторов: возвращаемый дескриптор всегда INVALID_HANDLE_VALUE

Я пытаюсь перечислить информацию об устройстве для всех мониторов, которые в данный момент подключены к компьютеру. У меня есть функция, которая может сделать это, и она выполнена на 90%, кроме случаев, когда я вызываю функцию SetupDiGetClassDevs() со вторым набором параметров (не NULL) функция всегда завершается ошибкой (возвращает INVALID_HANDLE_VALUE).

Когда я звоню GetLastError() Я получаю ошибку 13 (десятичное число), т.е. "The data is invalid" что я не уверен, что это значит?

Что не так? Можете ли вы дать какие-либо советы о том, что происходит и как я могу это исправить?

Информация о функции:

HDEVINFO SetupDiGetClassDevs(
_In_opt_  const GUID *ClassGuid,
_In_opt_  PCTSTR Enumerator,     // According to MSDN this param MUST be set if I want Device Information for a specific class(Monitors)
_In_opt_  HWND hwndParent,
_In_      DWORD Flags
);

Моя функция, которая пытается получить набор информации об устройстве только для мониторов и вывести информацию о каждом мониторе (строка ошибки комментируется):

void printDeviceData(GUID guID)
{
// Device Classes:        http://msdn.microsoft.com/en-us/library/windows/hardware/ff553426
// System Device Classes: http://msdn.microsoft.com/en-us/library/windows/hardware/ff553428
// Monitor Class GUI:     {4d36e96e-e325-11ce-bfc1-08002be10318}

DWORD dataT                    = 0;
PCTSTR monitorGuID             = _T("");
SP_DEVINFO_DATA deviceInfoData = {0};
deviceInfoData.cbSize          = sizeof(SP_DEVINFO_DATA);
deviceInfoData.ClassGuid       = guID;

// Step 1: Get Device Information Set for Monitors only
// ERROR OCCURS HERE: SetupDiGetClassDevs() always fails
// Also tried these values for param 2: "Monitor" "PCI" but all cause the function to return INVALID_HANDLE_VALUE
HDEVINFO hDevInfo = SetupDiGetClassDevs(&guID, _T("{4d36e96e-e325-11ce-bfc1-08002be10318}"), NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);
if (hDevInfo == INVALID_HANDLE_VALUE) {
//outputLastError(_T("Fail 1"));
printf("hDevInfo == INVALID_HANDLE_VALUE\n");
return;
}
else printf("SUCCESS 1\n");

if (SetupDiGetSelectedDevice(hDevInfo, &deviceInfoData) == FALSE) {
//outputLastError(_T("SetupDiGetSelectedDevice(hDevInfo, &deviceInfoData) == FALSE"));
printf("SetupDiGetSelectedDevice(hDevInfo, &deviceInfoData) == FALSE, %d, %x\n", GetLastError(), GetLastError());
return;
}
else printf("SUCCESS 2\n");

// Step 2: For each Monitor: Output Device information
const unsigned int FLAG_NUM = 30;
DWORD flags[] = {SPDRP_FRIENDLYNAME, SPDRP_ENUMERATOR_NAME, SPDRP_PHYSICAL_DEVICE_OBJECT_NAME, SPDRP_DEVICEDESC,
SPDRP_ADDRESS, SPDRP_BUSNUMBER, SPDRP_BUSTYPEGUID, SPDRP_CHARACTERISTICS, SPDRP_CLASS, SPDRP_CLASSGUID,
SPDRP_COMPATIBLEIDS, SPDRP_CONFIGFLAGS, SPDRP_DEVICE_POWER_DATA, SPDRP_DEVTYPE, SPDRP_DRIVER,
SPDRP_ENUMERATOR_NAME, SPDRP_EXCLUSIVE, SPDRP_HARDWAREID, SPDRP_INSTALL_STATE, SPDRP_LEGACYBUSTYPE,
SPDRP_LOCATION_INFORMATION, SPDRP_LOCATION_PATHS, SPDRP_LOWERFILTERS, SPDRP_MFG,
SPDRP_PHYSICAL_DEVICE_OBJECT_NAME, SPDRP_UI_NUMBER, SPDRP_UI_NUMBER_DESC_FORMAT, SPDRP_UPPERFILTERS,
SPDRP_SECURITY_SDS, SPDRP_SECURITY, SPDRP_SERVICE };

for (int i=0; i<=FLAG_NUM; i++) {
DWORD buffersize = 0;
LPTSTR buffer    = NULL;

while (!SetupDiGetDeviceRegistryProperty(hDevInfo,  &deviceInfoData, flags[i], &dataT,
(PBYTE)buffer, buffersize, &buffersize))
{
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
// Change the buffer size.
if (buffer)
LocalFree(buffer);
buffer = (LPTSTR)LocalAlloc(LPTR, buffersize);
}
else {
// Insert error handling here.
break;
}
}

printf("Data: %d: %s\n", i, buffer);
if (buffer)
LocalFree(buffer);
}

SetupDiDestroyDeviceInfoList(hDevInfo);
}

0

Решение

Согласно документации, для перечислителя должен быть указан действительный идентификатор экземпляра устройства, который в соответствии с http://msdn.microsoft.com/en-us/library/windows/hardware/ff541327 должно быть указано так

«PCI \ VEN_1000&DEV_0001&SUBSYS_00000000&REV_02 \ 1&08″

Я не проверял это, но я предполагаю, что именно отсюда поступают неверные данные.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]