从C#调用时,ReadFileEx完成回调给出错误的字节数

时间:2012-01-29 00:15:20

标签: c# winapi interop pinvoke

我正在使用pinvoke从C#调用ReadFileEx。我有类似的代码在C ++中工作。

我的回调委托是:

[UnmanagedFunctionPointer(CallingConvention.Winapi)]
public delegate void ReadFileCompletionDelegate(
  uint dwErr, 
  uint cbBytesRead, 
  ref OVERLAPPED overlapped);
  1. 我在调用之前将OVERLAPPED结构清零。
  2. 我使用CreateFile致电Overlapped | NoBuffering
  3. 接下来,我调用ReadFileEx传递重叠的结构和回调。
  4. 最后,我使用SleepEx(INFINITE, true)等待
  5. 我的回调被调用,所以这是一个好的开始。但是,它表现得很奇怪。

    附加调试器后,cbBytesRead参数始终为768 - 尽管我将缓冲区大小传递给ReadFileEx

    如果没有附加调试器,cbBytesRead始终为0xFFFFFFFF,或者我传递给SleepEx来电!如果我调用SleepEx(1337, true),我的cbBytesRead将为1337.当调用我的回调时,此值也与重叠结构的InternalHigh参数匹配。

    我的C ++实现按预期工作(cbBytesRead通常是缓冲区大小),那么为什么在使用C#/ pinvoke时它会失败?

    完整的源代码在这里:https://gist.github.com/1696375

    编辑:

    我发现通过使用CreateEvent并将事件与我的OVERLAPPED结构相关联,我突然开始获得实数。 SleepEx在.NET下的行为与C ++不同吗?

0 个答案:

没有答案