我正在使用pinvoke从C#调用ReadFileEx。我有类似的代码在C ++中工作。
我的回调委托是:
[UnmanagedFunctionPointer(CallingConvention.Winapi)]
public delegate void ReadFileCompletionDelegate(
uint dwErr,
uint cbBytesRead,
ref OVERLAPPED overlapped);
CreateFile
致电Overlapped | NoBuffering
。ReadFileEx
传递重叠的结构和回调。 SleepEx(INFINITE, true)
等待我的回调被调用,所以这是一个好的开始。但是,它表现得很奇怪。
附加调试器后,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 ++不同吗?