Почему мой вызов ReadFile завершается ошибкой, если он не вызывается в той же функции, что и CreatePipe? - PullRequest
1 голос
/ 01 октября 2010

У меня проблемы с использованием каналов в более крупном приложении, поэтому я создал минимальное тестовое приложение для изучения проблемы.

Я создаю канал:

Dim sa As SECURITY_ATTRIBUTES
Dim R As Long
sa.nLength = Len(sa)
sa.bInheritHandle = 1
R = CreatePipe(hRead, hWrite, sa, 0) //hRead declared globally
Debug.Print "CreatePipe: " & R

и затем читаю из него:

Const BufSize As Long = 1024 
Dim Buffer(BufSize) As Byte
Dim lBytesRead As Long
Dim R As Long
R = ReadFile(hRead, Buffer(0), BufSize, lBytesRead, 0)
Debug.Print "ReadFile: " & R
Debug.Print Err.LastDllError

Теперь, насколько я понимаю, ReadFileвызов должен блокироваться, потому что никто не записал никаких данных в канал.

Проблема: это происходит только тогда, когда я ставлю код сразу после кода CreatePipe.Как только я помещаю его в отдельную функцию, происходит сбой с последней ошибкой ERROR_INVALID_HANDLE.(Я подтвердил, что значение hRead не меняется)

Я не имею ни малейшего представления, что является причиной такого поведения.

1 Ответ

1 голос
/ 04 октября 2010

Я нашел решение сам. Это была довольно глупая ошибка новичка, но я обнаружил, что у некоторых пользователей возникла та же проблема, и, поскольку симптомы ошибки вовсе не указывают в правильном направлении, я опубликую свое решение.

Сначала я провел дальнейшие рефакторинги, чтобы еще больше заглушить код. Сделав каждую переменную глобальной, я наконец-то получил ошибку «недопустимое соглашение о вызовах» при вызове ReadFile.

Короче говоря, объявление импорта и фактический вызов ReadFile были неверными для последнего параметра (параметр OVERLAPPED)

Вот что я сделал:

Declare Function ReadFile ..., lpOverlapped As Any) As Long
Call ReadFile(..., 0)

Правильно будет любой из этих:

Declare Function ReadFile ..., lpOverlapped As Any) As Long
Call ReadFile(..., ByVal 0)

Declare Function ReadFile ..., ByVal lpOverlapped As Long) As Long
Call ReadFile(..., 0)

Declare Function ReadFile ..., lpOverlapped As OVERLAPPED) As Long
Call ReadFile(..., myVariableOfTypeOverlapped)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...