【问题标题】:FileStream and Asynchronous I/O with a device带有设备的 FileStream 和异步 I/O
【发布时间】:2013-07-15 05:07:39
【问题描述】:

我在将 FileStream 写入 SafeFileHandle 时遇到一些问题,该文件用于将数据写入 HID 设备。我将发布代码的 sn-ps,因为它们出现在几个不同的对象中。

这是句柄创建代码:

HidHandle = FileIO.CreateFile(pDevicePathName, FileIO.GENERIC_READ | FileIO.GENERIC_WRITE, FileIO.FILE_SHARE_READ | FileIO.FILE_SHARE_WRITE, IntPtr.Zero, FileIO.OPEN_EXISTING, FileIO.FILE_FLAG_OVERLAPPED, 0);

返回的句柄有效。

然后是流:

FileStreamDevice = new FileStream(HidHandle, FileAccess.ReadWrite, 65, true);

流创建成功,但 Position 和 Length 都返回 NotSupportedException(这很正常)。

然后我发送消息:

byte[] pMsg = new byte[65];    

ManualResetEvent manualevent = new ManualResetEvent(false);

IAsyncResult asynResult = device.FileStreamDevice.BeginWrite(pMsg, 0, pMsg.Length, 
            new AsyncCallback(End_Write), new DeviceAsyncState(device.FileStreamDeviceData, manualevent));

这会立即返回以下异常消息:

 'The parameter is incorrect'

这是堆栈跟踪的顶部:

at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.BeginWriteCore(Byte[] bytes, Int32 offset, Int32 numBytes, AsyncCallback userCallback, Object stateObject) 

提前致谢。

【问题讨论】:

  • 您将构造函数的 isAsync 参数设置为 true。但这只有在为重叠 I/O 打开 HidHandle 时才有效。如果不是,那么它将因语句异常消息而失败。您需要使用 Write() 而不是 BeginWrite()。
  • HidHandle 是为重叠 I/O 打开的,它具有“FileIO.FILE_FLAG_OVERLAPPED”参数集。
  • 调用 Write() 而不是 BeginWrite() 会发生什么?如果仍然失败,请考虑此错误代码来自驱动程序。
  • 您解决了这个问题吗?我在写入 HID 时遇到了类似的问题
  • 是的,问题是 HID 设备要求我写入确切的字节数,因为它的输出缓冲区大小。

标签: c# filestream hid safefilehandle


【解决方案1】:

您是否检查了异常中的给定 win 错误代码? 关于跟踪应该包含一个错误代码。

您可能超出的数据长度是否有限制?

【讨论】:

    猜你喜欢
    • 2023-03-15
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 2015-08-22
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    相关资源
    最近更新 更多