首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

为什么对USB(HID)接口的设备WriteFile()返回都是0?该怎么处理

2012-01-03 
为什么对USB(HID)接口的设备WriteFile()返回都是0?C/C++ codevoid CVCUSBHIDDlg::OnBnClickedButton1(){//

为什么对USB(HID)接口的设备WriteFile()返回都是0?

C/C++ code
void CVCUSBHIDDlg::OnBnClickedButton1(){    // TODO: 在此添加控件通知处理程序代码    ::HANDLE m_Handle = INVALID_HANDLE_VALUE ;    WORD wVID = 4292;    WORD wPID = 33896;    OpenDevice( m_Handle,wVID,wPID);    if(m_Handle == INVALID_HANDLE_VALUE)        return;    BYTE temp[6] ={0x32,0x33,0x34,0x35,0x36,0x37};    if(WriteDevice(m_Handle,&temp,6) == TRUE)    {        AfxMessageBox(_T("Test"));    }}


C/C++ code
// 打开设备BOOL CVCUSBHIDDlg::OpenDevice(HANDLE & handle, WORD wVID, WORD wPID){    BOOL bRet = false;    ::GUID hidGuid;    ::HDEVINFO hardwareDeviceInfo;    ::SP_INTERFACE_DEVICE_DATA deviceInfoData;    ::PSP_INTERFACE_DEVICE_DETAIL_DATA functionClassDeviceData = NULL;    ::ULONG predictedLength = 0;    ::ULONG requiredLength = 0;    //::CloseHandle(handle);    handle = INVALID_HANDLE_VALUE;    deviceInfoData.cbSize = sizeof(SP_INTERFACE_DEVICE_DATA);    ::HidD_GetHidGuid(&hidGuid);    hardwareDeviceInfo = ::SetupDiGetClassDevs(&hidGuid,NULL,NULL,(DIGCF_PRESENT | DIGCF_DEVICEINTERFACE));    for(int i=0;i<128;i++)    {        if (!SetupDiEnumDeviceInterfaces(hardwareDeviceInfo, 0, &hidGuid, i, &deviceInfoData))             continue;        SetupDiGetDeviceInterfaceDetail(hardwareDeviceInfo, &deviceInfoData, NULL, 0, &requiredLength, NULL);        predictedLength = requiredLength;        functionClassDeviceData = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(predictedLength);        if (!functionClassDeviceData)             continue;        functionClassDeviceData->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);        if (!SetupDiGetDeviceInterfaceDetail (hardwareDeviceInfo, &deviceInfoData, functionClassDeviceData, predictedLength, &requiredLength, NULL))             break;        handle = CreateFile(functionClassDeviceData->DevicePath, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);        if (handle != INVALID_HANDLE_VALUE)        {            HIDD_ATTRIBUTES attri;            HidD_GetAttributes(handle, &attri);        //    CString strAttributes;        //    strAttributes.Format(_T("VID:%d;PID:%d"),attri.ProductID,attri.VendorID);        //    AfxMessageBox(strAttributes);                        if ((attri.VendorID == wVID) &&                (attri.ProductID == wPID))            {                AfxMessageBox(_T("Find"));                bRet = TRUE;                break;            }                        CloseHandle(handle);            handle = INVALID_HANDLE_VALUE;        }    }    SetupDiDestroyDeviceInfoList(hardwareDeviceInfo);    return bRet;}


C/C++ code
// 写操作BOOL CVCUSBHIDDlg::WriteDevice(HANDLE handle , LPCVOID lpBuffer , DWORD dwSize){    BYTE wBuffer[8] = {0};    DWORD dwRet;    BOOL bRet;    wBuffer[0] = 0x01;    wBuffer[1] = 0x00;    memcpy(&wBuffer[2], lpBuffer, min(6, dwSize));    bRet = WriteFile(handle, wBuffer, 8, &dwRet, NULL);    return bRet;}


[解决办法]
调用GetLastError,看看是什么错误
[解决办法]
检查一下描述符格式
[解决办法]
〖1784〗-提供给请求操作的用户缓冲区无效。
文章出处:DIY部落(http://www.diybxSl.com/course/3_program/c++/cppjs/20090828/172683_3.html)
[解决办法]


提供给请求操作的用户缓冲区无效。
[解决办法]
USB设备WriteFile的时候要看设备的报告描述符是怎样写的

热点排行