zyq404
驱动牛犊
驱动牛犊
  • 注册日期2009-03-31
  • 最后登录2010-06-22
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望281点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:5979回复:7

同样WriteFIle错误,返回错误代码6

楼主#
更多 发布于:2009-07-07 20:34
WriteFIle错误,返回错误代码6

最近写了一个USB读写的应用程序,主要是用CreateFile,WriteFile和ReadFile,在CreateFile成功后,返回设备句柄hDevice

    hDevice = CreateFile(DevicePath,
                         GENERIC_READ|GENERIC_WRITE,
                         FILE_SHARE_READ | FILE_SHARE_WRITE,
                         NULL,
                         OPEN_EXISTING,
                         FILE_ATTRIBUTE_NORMAL,
                         NULL );

但在使用WriteFile时总是返回错误代码6,句柄无效! 此时查看句柄和创建文件时的句柄一致.
各位大大,帮忙看看是什么问题
zyq404
驱动牛犊
驱动牛犊
  • 注册日期2009-03-31
  • 最后登录2010-06-22
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望281点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-07-08 16:52
句柄不为空,我获得句柄:
我的handle是这样得到的:

   DevHandle = CreateFile(devDetail->DevicePath,
                        GENERIC_READ | GENERIC_WRITE,
                        FILE_SHARE_READ|FILE_SHARE_WRITE,
                        NULL,
                        OPEN_EXISTING,
                        FILE_FLAG_OVERLAPPED,
                        NULL);
devDetail->DevicePath : "\\?\usb#vid_0451&pid_bbbb#5&46718c6&07#{a5dcbf10-6530-11d2-901f-00c04fb951ed}"
zyq404
驱动牛犊
驱动牛犊
  • 注册日期2009-03-31
  • 最后登录2010-06-22
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望281点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-07-08 16:53
是这样的
DevHandle = CreateFile(devDetail->DevicePath,
                        GENERIC_READ | GENERIC_WRITE,
                        FILE_SHARE_READ|FILE_SHARE_WRITE,
                        NULL,
                        OPEN_EXISTING,
                        FILE_ATTRIBUTE_NORMAL,
                        NULL);
devDetail->DevicePath : "\\?\usb#vid_0451&pid_bbbb#5&46718c6&07#{a5dcbf10-6530-11d2-901f-00c04fb951ed}"
获得的句柄不为空
zyq404
驱动牛犊
驱动牛犊
  • 注册日期2009-03-31
  • 最后登录2010-06-22
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望281点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2009-07-08 16:54
但在writefile是说这个句柄是无效句柄。
zyq404
驱动牛犊
驱动牛犊
  • 注册日期2009-03-31
  • 最后登录2010-06-22
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望281点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2009-07-08 17:00
这是我获得handle的整个代码,帮忙看看有没有问题:

  deviceInfo = SetupDiGetClassDevs((LPGUID)&GUID_DEVINTERFACE_OMAP_DEVICE,
NULL,
NULL,
DIGCF_PRESENT | DIGCF_DEVICEINTERFACE);

if(deviceInfo == INVALID_HANDLE_VALUE)
{
return INVALID_HANDLE_VALUE;
}

    deviceInfoData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);

    for(index = 0; SetupDiEnumDeviceInterfaces(deviceInfo,
0,
(LPGUID)&GUID_DEVINTERFACE_OMAP_DEVICE,
index,
&deviceInfoData);
index++)
    {
SetupDiGetDeviceInterfaceDetail(deviceInfo,
&deviceInfoData,
NULL,
0,
&requiredLength,
NULL);

deviceDetailData = (SP_DEVICE_INTERFACE_DETAIL_DATA*)GlobalAlloc(GPTR, requiredLength);
deviceDetailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
SetupDiGetDeviceInterfaceDetail(deviceInfo,
&deviceInfoData,
deviceDetailData,
requiredLength,
&requiredLength,
NULL);

if(strstr( deviceDetailData->DevicePath, "bbbb") //PID
&& strstr( deviceDetailData->DevicePath, "0451")) //VID
{
strcat( Pipe1DevicePath, deviceDetailData->DevicePath);

hUSBDev = CreateFile( deviceDetailData->DevicePath,
GENERIC_WRITE | GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);


if(hUSBDev != INVALID_HANDLE_VALUE)
{
SetupDiDestroyDeviceInfoList(deviceInfo);
GlobalFree(deviceDetailData);
return hUSBDev;    //从这里返回不为0 handle, 但在writefile时却说这个handle是无用handle,错误类型  6
}
}

        GlobalFree(deviceDetailData);
    }
DWORD dError = GetLastError();
    SetupDiDestroyDeviceInfoList(deviceInfo);

return INVALID_HANDLE_VALUE;
zyq404
驱动牛犊
驱动牛犊
  • 注册日期2009-03-31
  • 最后登录2010-06-22
  • 粉丝0
  • 关注0
  • 积分34分
  • 威望281点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2009-07-09 09:27
sanone28 说的很对!!
问题解决。
还是CreateFile的问题,deviceDetailData->DevicePath只是一个通用路径,那针对不同的收发口,在deviceDetailData->DevicePath后面还要加上driver中定义PIPE的名称,例如如果driver中定义PIPE0作为收,那么在createfile收的handle的时候,就需要在deviceDetailData->DevicePath加上"//PIPE0",假如driver中没有特别说明,那么deviceDetailData->DevicePath也就是默认handle路径了。
游客

返回顶部