Обратный вызов завершения ReadFileEx дает неправильное количество байтов при вызове из C # - PullRequest
1 голос
/ 29 января 2012

Я использую pinvoke для вызова ReadFileEx из C #.У меня есть подобный код, работающий в 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) для ожидания

Мой обратный вызов вызван, так что это хорошее начало.Однако он ведет себя странно.

При подключенном отладчике параметр cbBytesRead всегда равен 768 - несмотря на размер буфера, который я передаю ReadFileEx.

Без отладчика cbBytesRead всегда 0xFFFFFFFF, или что бы я ни передавал на мой SleepEx вызов!Если я вызову SleepEx(1337, true), то мой cbBytesRead будет 1337. Это значение также соответствует параметру InternalHigh структуры Overlapped при вызове моего обратного вызова.

Моя реализация C ++ работает, как и ожидалось (cbBytesRead обычно является размером буфера), так почему же происходит сбой при использовании C # / pinvoke?

Полный исходный код находится здесь: https://gist.github.com/1696375

Редактировать:

Я обнаружил, что используя CreateEvent и связывая событие со своей структурой OVERLAPPED, я внезапно началполучать реальные цифры.SleepEx ведет себя иначе в .NET, чем в C ++?

...