Я использую pinvoke для вызова ReadFileEx из C #.У меня есть подобный код, работающий в C ++.
Мой делегат обратного вызова:
[UnmanagedFunctionPointer(CallingConvention.Winapi)]
public delegate void ReadFileCompletionDelegate(
uint dwErr,
uint cbBytesRead,
ref OVERLAPPED overlapped);
- Я обнуляю структуру OVERLAPPED перед вызовом.
- Я звоню
CreateFile
с Overlapped | NoBuffering
. - Затем я звоню
ReadFileEx
, передавая мою перекрытую структуру и обратный вызов. - Наконец, я использую
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 ++?