Member 12701845 Ответов: 1

Происходит аварийное завершение работы программы при использовании функции CreateFile с устройством пути


Я могу получить интерфейс устройства и распечатать путь устройства, но когда я ввожу путь устройства в качестве параметра для создания файла, программа выходит из строя в том месте, где она должна создать файл с ошибкой 0xC0000005.


У меня есть 64-битный компьютер с Windows 7, я пытаюсь подключиться к чтению данных с этой USB-веб-камеры специально
Docooler USB 2.0 12-мегапиксельная HD камера веб-камера с микрофоном Clip-on[^]
Вот код, который я использую.
Я автоматически устанавливаю необходимый размер деталей интерфейса на 90, потому что самый высокий - 82
У меня также есть if (i == 2), потому что именно тогда выводится путь устройства для камеры.
i= 0;

    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);
        }

        if(i == 2){
        webcam = CreateFile(webInterDetDat->DevicePath,(GENERIC_READ|GENERIC_WRITE),(FILE_SHARE_READ|FILE_SHARE_WRITE),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 %s\n",webcam);
            close(webcam);
        }
        }

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

    if(sdei){
    }else{
        printf("Getting SetupDiEnumDeviceInterfaces error %d I is %d\n",GetLastError(), i);
    }


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

Я попытался сохранить его в А-методах, а затем попытался изменить его на широкие методы.
Я пытался изменить"? "на".". Затем я попробовал добавить"\\\. \ " и "\\\?\", но это все равно не сработало.
Когда я комментирую метод create file, он работает отлично и доходит до конца программы без ошибок.

jeron1

Если вы установите точку останова при вызове CreateFile (), все параметры будут такими, как вы ожидаете?

Member 12701845

Я попробовал пройти через него с помощью отладчика, и похоже, что все значения верны. У вас есть еще какие-нибудь идеи?

1 Ответов

Рейтинг:
7

Jochen Arndt

Код ошибки 0xC0000005 это HRESULT форма ошибки 5 (ERROR_ACCESS_DENIED) с удобствами NULL.

Если вам не нужно писать на веб-камеру, попробуйте открыть устройство только для чтения. Если это тоже не удается или вам нужно писать, попробуйте выполнить приложение от имени администратора.

[РЕДАКТИРОВАТЬ]
Только что видел эту строчку:

printf("Creating File did work %s\n",webcam);

webcam это HANDLE передается как строковый параметр printf Это может привести к нарушению доступа или неожиданному поведению, когда CreateFile был удачный.
[/РЕДАКТИРОВАТЬ]


Member 12701845

Я пробовал работать от имени администратора как для чтения, так и для записи и только для чтения, и это все еще дает мне тот же сбой с той же ошибкой.

Jochen Arndt

Крушение?
Вы проверяете возвращаемое значение, чтобы не было сбоя.

Но посмотрите мой обновленный ответ о возможной причине, которую я раньше не осознавал.

Если это не причина, вы также можете попытаться открыть его с эксклюзивным доступом (без флагов общего доступа). Это должно завершиться неудачей с ERROR_SHARING_VIOLATION, когда устройство уже открыто другим приложением. Если это так, попробуйте свой код также с закрытым другим приложением.

Member 12701845

Я посмотрел на вашу правку, и это помогло мне решить мою проблему. Я просто вырезал печать переменной, и теперь она печатает, что "создание файла действительно сработало". Теперь он выходит из строя в строке "закрыть (веб-камера)" с ошибкой 0xC0000096

Jochen Arndt

Другая ошибка.

Дескрипторы, возвращаемые функцией CreateFile (), должны быть закрыты функцией CloseHandle ().

Member 12701845

Что было то было.
Спасибо