Является ли мой дескриптор устройства недействительным и или он не совместим с функциями программирования 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
Внимательно прочтите документацию по этим функциям. Некоторые дескрипторы действительны не только для некоторых функций. Проверьте все права и флаги.
Удачи.