Member 12701845 Ответов: 2

Является ли мой дескриптор устройства недействительным и или он не совместим с функциями программирования COM


Я пытаюсь получить данные с камеры USB 2.0. Я пытаюсь использовать DeviceIOControl с IOCTL_CHANGER_GET_STATUS и получаю сообщение об ошибке, указывающее, что дескриптор недействителен. Затем я попытался использовать GetCommState, и он сообщает об ошибке 1, говоря, что это не существующая функция (у меня есть winbase.h и windows.h, включенные в мою программу). Когда я использую CreateFile (), он работает и не возвращает код ошибки INVALID_HANDLE_VALUE. Все работает нормально, пока я не дойду до методов DeviceIOControl и GetCommState, это тоже доходит до конца. на данный момент я не знаю, небольшая ли это ошибка, неправильный тип GUID или совершенно другое направление, в котором мне нужно действовать.

if((webdevices = SetupDiGetClassDevs(&GUID_DEVINTERFACE_USB_DEVICE,NULL,NULL,(DIGCF_PRESENT|DIGCF_DEVICEINTERFACE))) != NULL){
            printf("SetupDiGetClassDevs Worked!!\n");
    }else{
        printf("SetupDiGetClassDevs didn't work error %d\n",GetLastError());
    }

    webDevInfoDat->cbSize = sizeof(SP_DEVINFO_DATA);
    webInterDat->cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
    SetupDiEnumDeviceInfo(webdevices,i,webDevInfoDat);
    while(sdei = SetupDiEnumDeviceInterfaces(webdevices,NULL,&GUID_DEVINTERFACE_USB_DEVICE,i,webInterDat)){

        if(SetupDiGetDeviceInterfaceDetail(webdevices,webInterDat,webInterDetDat,interDetSiz,&reqInterDetSiz,webDevInfoDat)){

            printf("Interface Detail Data\nDevicePath: %s\nRequired Size: %d\n",webInterDetDat->DevicePath,reqInterDetSiz);
            
        }else{
            printf("Getting SetupDiGetDeviceDetail error %d RequiredSize %d\n",GetLastError(),reqInterDetSiz);
        }

            webcam = CreateFile(webInterDetDat->DevicePath,(GENERIC_READ|GENERIC_WRITE),0,NULL,OPEN_EXISTING,0,NULL);
            if(webcam == INVALID_HANDLE_VALUE){
            printf("Creating File didn't work %d\n",GetLastError());
            }else{
                printf("Creating File did work\n");
                if(webInterDetDat->DevicePath[13] != '9'){//to make sure it is the camera
                    CloseHandle(webcam);
                }else{
                    printf("save this file\n");
                    break;
                }
            }

        printf("\n");
        i++;
        webInterDat->cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
    }

/*********************************************
get device media information with IO control
*************************************************/

    if(DeviceIoControl(webcam,IOCTL_CHANGER_GET_STATUS,NULL,0,NULL,0,&sizeOfgCP,&oLap) != 0){
        printf("Getting CHANGER_GET_STATUS worked %d\n",sizeOfgCP);
    }else{
        printf("Getting CHANGER_GET_STATUS failed. error %d\nRequired Size %d\n",GetLastError(),sizeOfgCP);
    }
    if(GetCommState(webcam,&webcamDCB) != 0){
      printf("Getting GetCommState worked! baud rate is %d\n",webcamDCB.BaudRate);
    }else{
        printf("Getting GetCommState failed %d\n",GetLastError());
    }


Что я уже пробовал:

Мое устройство-GUID_DEVINTERFACE_USB_DEVICE, а затем я изменил его на GUID_CLASS_USB_DEVICE. Я также изменил createfile с неперекрывающегося на перекрывающийся и удалил общий доступ из файла. Когда я распечатываю InterfaceDetailData- & gt; Devicepath, я получаю

\\?\vid_1908 USB на#&амп;pid_2310#5&амп;25c44976 усилителя;amp; 0&амп;3#{a5dcbf10-6530-11d2-901f-00c04fb951ed}

KarstenK

Внимательно прочтите документацию по этим функциям. Некоторые дескрипторы действительны не только для некоторых функций. Проверьте все права и флаги.

Удачи.

2 Ответов

Рейтинг:
9

Jochen Arndt

То INVALID_HANDLE_VALUE ошибка решается решением 1.

То Функция GetCommState (Windows)[^] функции возвращаются ERROR_INVALID_FUNCTION потому что эта функция не поддерживается драйвером устройства. Причина отсутствия поддержки очевидна:

Коммуникационный ресурс - это физическое или логическое устройство, обеспечивающее единый двунаправленный асинхронный поток данных. Последовательные порты, параллельные порты, факсимильные аппараты и модемы являются примерами коммуникационных ресурсов.
Ваше устройство - это веб-камера, которая не относится к классу коммуникационных устройств.

Похожие на IOCTL_CHANGER_GET_STATUS Функция IOCTL:
Он не поддерживается драйвером вашей веб-камеры. Вы должны попытаться получить документацию к драйверу (часто прилагаемую к SDK, предоставляемому производителем устройства), чтобы проверить, какие функции поддерживаются. Если драйвер поддерживает эту функцию, вам все равно нужна документация, потому что она содержит описание возвращаемых данных.


Member 12701845

Я пробовал делать разные методы с GUID_DEVINTERFACE_USB_DEVICE, но ни один из них, похоже, не работает. Похоже, что только DeviceIOControl имеет публичные методы для GUID_DEVINTERFACE_USB_HUB, GUID_DEVINTERFACE_USB_HOST_CONTROLLER. Я узнал, какие коды работают с ними, посмотрев на заголовочный файл, в котором они объявлены, и на веб-сайт microsoft, чтобы получить более подробную информацию об этом.

https://msdn.microsoft.com/en-us/library/windows/hardware/ff537236%28v=vs.85%29.aspx

Мне просто придется работать над этим с этого момента. спасибо Вам за помощь

Рейтинг:
2

Frankie-C

Ваш код, кажется, запутан и не имеет инициализации.
Эта, быстрая и грязная фиксация, работает скомпилированно как обычный C:

#include <windows.h>
#include <SetupAPI.h>
#include <stdio.h>
#include <stddef.h>

GUID GUID_DEVINTERFACE_USB_DEVICE = {0xA5DCBF10, 0x6530, 0x11D2, {0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED}};

HANDLE webcam = NULL;

/*
 *	get device media information with IO control
 */
void UseDeviceIoControl(HANDLE hwebcam)
{
	DWORD sizeOfgCP = 0;
	OVERLAPPED oLap = {0};
	if (DeviceIoControl(hwebcam, IOCTL_CHANGER_GET_STATUS, NULL, 0, NULL, 0, &sizeOfgCP, &oLap) != 0)
	{
		printf("Getting CHANGER_GET_STATUS worked %d\n", sizeOfgCP);
	}
	else
	{
		printf("Getting CHANGER_GET_STATUS failed. error %d\nRequired Size %d\n", GetLastError(), sizeOfgCP);
	}
	DCB webcamDCB;
	if (GetCommState(webcam, &webcamDCB) != 0)
	{
		printf("Getting GetCommState worked! baud rate is %d\n", webcamDCB.BaudRate);
	}
	else
	{
		printf("Getting GetCommState failed %d\n", GetLastError());
	}
}

int main(void)
{
	HDEVINFO webdevices;

	if ((webdevices = SetupDiGetClassDevs(&GUID_DEVINTERFACE_USB_DEVICE, NULL, NULL, (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE))) != NULL)
	{
		printf("SetupDiGetClassDevs Worked!!\n");
	}
	else
	{
		printf("SetupDiGetClassDevs didn't work error %d\n", GetLastError());
	}
	SP_DEVINFO_DATA webDevInfoDat;
	webDevInfoDat.cbSize = sizeof(SP_DEVINFO_DATA);
	SP_DEVICE_INTERFACE_DATA webInterDat;
	webInterDat.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

	int i=0;
	SetupDiEnumDeviceInfo(webdevices, i, &webDevInfoDat);

	BOOL sdei;
	while (TRUE == (sdei = SetupDiEnumDeviceInterfaces(webdevices, NULL, &GUID_DEVINTERFACE_USB_DEVICE, i, &webInterDat)))
	{
		printf ("Device%d) ", i);
		PSP_DEVICE_INTERFACE_DETAIL_DATA_A pwebInterDetDat = NULL;
		DWORD interDetSiz = 0;
		DWORD reqInterDetSiz = 0;
		DWORD err = SetupDiGetDeviceInterfaceDetail(webdevices, &webInterDat, pwebInterDetDat, interDetSiz, &reqInterDetSiz, &webDevInfoDat);
		if (ERROR_INSUFFICIENT_BUFFER != GetLastError())
		{
			printf("SetupDiGetDeviceInterfaceDetail failed!\n");
			ExitProcess(1);
		}
		pwebInterDetDat = malloc(reqInterDetSiz);
		pwebInterDetDat->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA_A);
		interDetSiz = reqInterDetSiz;
		if (SetupDiGetDeviceInterfaceDetail(webdevices, &webInterDat, pwebInterDetDat, interDetSiz, &reqInterDetSiz, &webDevInfoDat))
		{
			printf("Interface Detail Data\nDevicePath: %s\nRequired Size: %d\n", pwebInterDetDat->DevicePath, reqInterDetSiz);

		}
		else
		{
			printf("Getting SetupDiGetDeviceDetail error %d RequiredSize %d\n", GetLastError(), reqInterDetSiz);
		}
		webcam = CreateFile(pwebInterDetDat->DevicePath, (GENERIC_READ | GENERIC_WRITE), 0, NULL, OPEN_EXISTING, 0, NULL);
		if (webcam == INVALID_HANDLE_VALUE)
		{
			printf("Creating File didn't work %d\n", GetLastError());
		}
		else
		{
			printf("Creating File did work\n");
			if (pwebInterDetDat->DevicePath[13] != '9')
			{	//to make sure it is the camera
				CloseHandle(webcam);
			}
			else
			{
				printf("save this file\n");
				UseDeviceIoControl(webcam);
				break;
			}
		}
		printf("\n");
		i++;
		webInterDat.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
		free(pwebInterDetDat);
	}
}

Обратите внимание на динамическое распределение буферов в соответствии с требованиями системы.
Конечно, в коде отсутствуют расширенные проверки ошибок.


Member 12701845

Я попробовал ваше решение, и оно все еще не работает для меня. Теперь я все еще получаю ошибку 1 для обеих функций. Вы получили функции, чтобы работать должным образом без того, когда вы запустили его?