Необработанный ввод winapi в c, не могу получить информацию об устройстве - PullRequest
0 голосов
/ 13 марта 2011

Я возиться с USB-сканером RFID и пытаюсь прочитать ввод с необработанный ввод , пока у меня есть это

#define _WIN32_WINNT 0x0601
#include <windows.h>
#include <stdio.h>

int main(void)
{
    PRAWINPUTDEVICELIST pRawInputDeviceList;
    PUINT puiNumDevices, pcbSize;
    UINT cbSize = sizeof(RAWINPUTDEVICELIST);
    char *pData[1000];

    GetRawInputDeviceList(NULL, puiNumDevices, cbSize);    
    pRawInputDeviceList = malloc(cbSize * *puiNumDevices);   
    GetRawInputDeviceList(pRawInputDeviceList, puiNumDevices, cbSize);

    // gives a correct RIM_TYPE for all devices 0-7 (GetRawInputDeviceList returns 8 devices for me)
    printf("%I32u\n", pRawInputDeviceList[0].dwType); 


    GetRawInputDeviceInfo(pRawInputDeviceList[1].hDevice, RIDI_DEVICENAME, pData, pcbSize);

    // gives a huge number (garbage?), should be the length of the name
    printf("%u\n", pcbSize);        

    // "E" in my case
    printf("%s\n", pData);

    // error 87, apparently ERROR_INVALID_PARAMETER
    printf("%I32u\n", GetLastError()); 

    return 0;

}

Ответы [ 2 ]

1 голос
/ 13 марта 2011

Когда вы звоните GetRawInputDeviceInfo, он ожидает, что pcbSize будет указателем. Вы имеете это как указатель, но это не указывает ни на что. Попробуйте это:

  1. Избавьтесь от pcbSize (везде).
  2. Создать переменную UINT cbDataSize = 1000. Это размер вашего pData массива.
  3. Для последнего аргумента GetRawInputDeviceInfo используйте &cbDataSize. Это занимает адрес cbDataSize, адрес является указателем.
  4. Изменить printf("%u\n", pcbSize); на printf("%u\n", cbDataSize);.

Посмотрите, как это работает для вас.

[править]

Кроме того, вы должны сделать то же самое для puiNumDevices. Вместо этого создайте UINT с именем uiNumDevices. Используйте &uiNumDevices там, где функции ожидают указателей.

0 голосов
/ 13 марта 2011

Я собираюсь выйти здесь на конечность и предположить, что эта штука на самом деле может быть устройством HID.Знаете ли вы, если это так?

HID С устройствами на самом деле довольно легко общаться;вы подключаетесь к ним через CreateFile () - так же, как вы открываете COM-порт - и затем просто читаете ReadFile () для получения данных.

Большая часть проблемы заключается в определении правильного пути для подключенияк.Это на самом деле значение DevicePath, которое вы получаете из SetupDiGetDeviceInterfaceDetail ().

Грубая карта выглядит следующим образом:

HidD_GetHidGuid (), чтобы получить HID guid
SetupDiGetClassDevs () дляполучить список dev
Цикл по разработчикам, пока вы не найдете свой:

  • SetupDiEnumDeviceInterfaces () для перечисления интерфейсов устройства
  • SetupDiGetDeviceInterfaceDetail () дляполучить сведения
  • CreateFile (), чтобы открыть устройство с DevicePath из сведений.
  • HidD_GetAttributes, чтобы получить vendorid и productid, чтобы определить, является ли оно вашим устройством.

Если это так, запомните его и используйте ReadFile () для получения данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...