2011-03-13 102 views
0

我有一個USB RFID掃描器瞎搞,並試圖與raw input讀取輸入,到目前爲止,我有這個原始輸入WINAPI在C中,無法獲得設備信息

#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; 

} 

回答

1

當您致電GetRawInputDeviceInfo時,它預計pcbSize是一個指針。你有它作爲指針,但它沒有指向任何東西。試試這個:

  1. 擺脫pcbSize(到處都是)。
  2. 創建變量UINT cbDataSize = 1000。這是您的pData陣列的大小。
  3. 對於GetRawInputDeviceInfo最後一個參數,使用&cbDataSize。這需要地址cbDataSize,地址是一個指針。
  4. 變化printf("%u\n", pcbSize);printf("%u\n", cbDataSize);

見怎麼說你的作品。

[編輯]

此外,你應該做同樣的事情puiNumDevices。相反,請創建一個名爲uiNumDevicesUINT。使用&uiNumDevices函數期望指針。

0

我要去並且猜測這件事實際上可能是HID設備。你知道嗎?

HID設備實際上是非常容易溝通;你通過CreateFile()連接到它們 - 就像打開一個COM端口一樣 - 然後用ReadFile()來獲取數據。

大部分的問題是找出連接到正確的路徑。它實際上是一個從SetupDiGetDeviceInterfaceDetail()獲得的名爲DevicePath的值。

它的一個粗略的地圖看起來是這樣的:

HidD_GetHidGuid()來獲得()的GUID
SetupDiGetClassDevs的HID獲得的開發
通過開發者循環列表,直到你找到你:

  • SetupDiEnumDeviceInterfaces()來枚舉所述設備接口
  • SetupDiGetDeviceInterfaceDetail()來獲得細節
  • CreateFile()從詳細信息中用DevicePath打開設備。
  • HidD_GetAttributes獲得廠商ID和產品ID,看它是否是你的設備。

如果是,記住它,並使用ReadFile的()來獲取數據。