坑上放块板儿 2016-01-28 04:48 采纳率: 0%
浏览 2187
已结题

求大神帮忙! WriteFile 写入长度只能为9 什么7啊 8啊 10啊都报错!

之前下资料币用完了 ! 好人全家幸福 一生平安
DevHID::DevHID(WORD vid, WORD pid)
{
if (GetDevicePath(vid, pid))
{
writeHandle = CreateFile(devDetail->DevicePath,
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
NULL);

    if (writeHandle == INVALID_HANDLE_VALUE)
    {
        cout << "创建写句柄失败!" << endl;
    }

    readHandle = CreateFile(devDetail->DevicePath,
        GENERIC_WRITE | GENERIC_READ,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED,
        NULL);

    if (readHandle == INVALID_HANDLE_VALUE)
    {
        cout << "创建读句柄失败!" << endl;
    }
}
else
{
    cout << "获取设备路径失败!" << endl;
}

}

BOOL DevHID::GetDevicePath(DWORD VID, DWORD PID)
{
HDEVINFO hDevInfo; // 设备信息结构
GUID hidGuid; // 设备接口类

ULONG  requiredLength;        //  指定接受缓冲区大小;  

//  设备句柄
HANDLE hidHandle;


//  用于接受VID PID
_HIDD_ATTRIBUTES hidAttributes;

//  获取符合条件的设备信息
HidD_GetHidGuid(&hidGuid);

//  获得信息
hDevInfo = SetupDiGetClassDevs(
    &hidGuid,
    NULL,
    NULL,
    (DIGCF_PRESENT | DIGCF_DEVICEINTERFACE));

if (hDevInfo == INVALID_HANDLE_VALUE)
{
    return FALSE;  //  错误返回
}

SP_DEVICE_INTERFACE_DATA devInfoData;       //  设备信息集合
devInfoData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

for (int deviceNo = 0; deviceNo < 20; deviceNo++)
{
    //  枚举设备
    if (!SetupDiEnumInterfaceDevice(
        hDevInfo,
        0,
        &hidGuid,
        deviceNo,
        &devInfoData))
    {
        //  错误返回
        SetupDiDestroyDeviceInfoList(hDevInfo);
        return FALSE; 
    }

    //   获得缓冲区大小
    SetupDiGetInterfaceDeviceDetail(hDevInfo,
        &devInfoData,
        NULL,
        0,
        &requiredLength, // 接受缓冲区大小
        NULL);

    //  根据返回的信息分配缓冲区大小
    devDetail = (PSP_INTERFACE_DEVICE_DETAIL_DATA)malloc(requiredLength);

    //  指定大小
    devDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);


    //  填充设备路径信息缓冲区
    if (!SetupDiGetInterfaceDeviceDetail(hDevInfo,
        &devInfoData,
        devDetail,
        requiredLength,
        NULL,
        NULL))
    {
        SetupDiDestroyDeviceInfoList(hDevInfo);
        free(devDetail);
        return FALSE;
    }

    //  打开设备
    hidHandle = CreateFile(devDetail->DevicePath,
        NULL,
        FILE_SHARE_READ | FILE_SHARE_WRITE,
        NULL,
        OPEN_EXISTING,
        FILE_ATTRIBUTE_NORMAL,
        NULL);

    if (hidHandle == INVALID_HANDLE_VALUE)
    {
        // 失败
        SetupDiDestroyDeviceInfoList(hDevInfo);
        CloseHandle(hidHandle);
        free(devDetail);
        return FALSE;
    }

    if (!HidD_GetAttributes(hidHandle, &hidAttributes))
    {
        //  获得失败
        SetupDiDestroyDeviceInfoList(hDevInfo);
        CloseHandle(hidHandle);
        free(devDetail);
        return FALSE;
    }

    if ((VID == hidAttributes.VendorID  && 
        PID == hidAttributes.ProductID))
    {
        //  匹配并退出
        SetupDiDestroyDeviceInfoList(hDevInfo);
        CloseHandle(hidHandle);
        return TRUE;
    }
}
SetupDiDestroyDeviceInfoList(hDevInfo);
CloseHandle(hidHandle);
return FALSE;

}


OVERLAPPED WriteOverlapped;
WriteOverlapped.Offset = 0;
WriteOverlapped.OffsetHigh = 0;

WriteOverlapped.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);


char WriteReportBuffer[64];

WriteReportBuffer[0] = 0x00;    
WriteReportBuffer[1] = 0x10;
WriteReportBuffer[2] = 0x20;
WriteReportBuffer[3] = 0x30;
WriteReportBuffer[4] = 0x40;
WriteReportBuffer[5] = 0x30;
WriteReportBuffer[6] = 0x40;


WriteFile(writeHandle,
    WriteReportBuffer,
    9,
    NULL,
    &WriteOverlapped);
cout << "CODE:" << GetLastError() << endl;

switch (WaitForSingleObject(WriteOverlapped.hEvent, 2000))
{
case WAIT_OBJECT_0:
    cout << " 函数返回成功!" << endl;
    return;
case WAIT_TIMEOUT:
    cout << " 间隔时间到!" << endl;
    return;
case WAIT_FAILED:
    cout << "WaitForSingleObject 失败!" << endl;
    return;
default:
    cout << "什么也没有做!" << endl;
}

  • 写回答

1条回答

  • 毕小宝 博客专家认证 2016-01-28 05:38
    关注

    你的方法调用没有问题,第三个参数表示需要将缓冲区中多少字节的数据写入问题,只要这个值不超过缓冲区的长度,应该是没有问题的。
    你调用不是9时报的错误信息是什么呢?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月14日
  • 已采纳回答 3月14日

悬赏问题

  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示