Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Агуров П.В. -> "Интерфейсы USB. Практика использования и программирования" -> 146

Интерфейсы USB. Практика использования и программирования - Агуров П.В.

Агуров П.В. Интерфейсы USB. Практика использования и программирования — СПб.: БХВ-Петербург, 2004. — 576 c.
ISBN 5-94157-202-6
Скачать (прямая ссылка): interface2004.djvu
Предыдущая << 1 .. 140 141 142 143 144 145 < 146 > 147 148 149 150 151 152 .. 166 >> Следующая

до 1 object_0+nCount-l) результат функции минус константа
(wait wait object 0 будет равен индексу объекта в
массиве lpHandles, первым перешедшего в
сигнальное состояние
wait_ timeout Тайм-аут завершен, а сигнальное состояние ни
одного объекта не достигнуто. Естественно, в
случае infinite такой результат невозможен
wai Т_ failed Ошибка вызова WaitForSingleObject
16.8. Функция GetOverlappedResult результат асинхронной операции
Функция GetOverlappedResult возвращает результат асинхронной операции с файлом или коммуникационным устройством.
Формат заголовка на языке С имеет вид:
BOOL GetOverlappedResult(
HANDLE hHandle, Il дескрипторов объекта (файла или порта)
LPOVERLAPPED lpOverlapped,// структура асинхронного вызова LPDWORD IpNBT, // число переданных или прочитанных байтов
BOOL bWait // флаг ожидания
);
гпава 16. Базовые функции Windows
485
Формат заголовка на языке Delphi имеет вид:
function GetOverlappedResult(
hFile : THandle; // дескрипторов объекта (файла или порта)
const lpOverlapped: TOverlapped; // структура асинхронного вызова var IpNBT : DWORD; // число переданных или прочитанных байтов
bWait : BOOL // флаг ожидания
): B00L;
Первый параметр передает дескриптор файла или коммуникационного устройства. Перед вызовом этот дескриптор должен быть связан с асинхронной
операцией, ВЫЗОВОМ ReadFile, WriteFile, DeviceloControl или WaitCommEvent.
Второй параметр передает структуру overlapped, которая использовалась при начале асинхронной операции.
Третий параметр возвращает число байтов, реально прочитанных или записанных в результате операции. Этот параметр не используется для коммуникационных портов.
Если параметр bwait равен true, то функция не завершится, пока операция не будет завершена. Если false и операция продолжается, то функция вернет FALSE, а ВЫЗОВ GetLastError ВЄРНЄТ ERR0R_I0_INC0MPETE.
В Windows 95/98/МЕ, если параметр bwait равен true, то поле hEvent в
Структуре OVERLAPPED НЄ МОЖЄТ бьіТЬ null.
16.8.1. Возвращаемое значение
При успешном выполнении функции возвращается ненулевое значение.
16.9. Функция DeviceloControl: прямое управление драйвером
Функция DeviceloControl посылает команду, задаваемую кодом dwioCode, напрямую драйверу устройства с дескриптором hDevice, указывая ему выполнить определенные действия.
Для коммуникационных устройств дескриптор можно получить с помощью вызова createFile с обязательным использованием флага асинхронных
Операций FILE_FLAG_0VERLAPPED.
Формат заголовка на языке С имеет вид:
BCOL DeviceloControl(
HANDLE hDevice, // дескрипторов устройства
486__Часть V. Справочник
LPOVERLAPPED lpOverlapped 11 структура асинхронного вызова
);
Формат заголовка на языке Delphi имеет вид:
function DeviceloControl(
hDevice : : THandle; Il дескрипторов устройства
dwIoControlCode : : DWORD; Il код выполняемой функции
IpInBuffer : : Pointer; /I указатель на входные данные
nlnBufferSize : : DWORD; 11 размер входного буфера
lpOutBuffer : : Pointer; II указатель на выходной буфер
nOutBufferSize : : DWORD; II размер выходного буфера
var lpBytesRetn : : DWORD; II требуемый размер выходного буфера
lpOverlapped: Poverlapped II структура асинхронного вызова
): BOOL;
Параметр lpin?uffer передает входные данные, если они необходимы для выполнения операции. Может быть передано null, если для выполнения операции не требуется дополнительной информации. Размер передаваемых входных данных задается параметром dwinBuf size.
Если функция, задаваемая кодом dwiocode, должна возвращать данные, то для этих данных передается указатель на буфер lpOutBuffer и его размер nOutBufsize. Если функция не возвращает данные, параметр lpOutBuffer
Должен бЫТЬ установлен B NULL, a nOutBuf Size в 0.
Последний параметр возвращает реальный размер данных, сохраненных в lpOutBufsize. Если буфер слишком маленький, функция завершится с ошибкой, а вызов GetLastError вернет error_insufficient_buffer. Значение lpBytesRetn в этом случае будет равно 0. Некоторые драйверы, если буфер мал для принятия полного пакета данных, возвращают только часть данных. В этом случае GetLastError возвращает значение ERR0R_M0RE_DATA, a lpBytesRetn равно числу полученных байтов. Приложение должно снова вызвать DeviceloControl с теми же параметрами, указав новый стартовый адрес.
ЕСЛИ lpOverlapped равно NULL, ТО lpByteRetn НЄ ДОЛЖНО бЫТЬ NULL. Даже
если функция не возвращает данные и lpOutBuffer равно null, вызов
DWORD dwIoCode, Il код выполняемой функции
LPVOID IpInBuffer, Il указатель на входные данные
DWORD dwInBufSize, Il размер входного буфера
LPVOID lpOutBuffer, // указатель на выходной буфер
DWORD nOutBufSize, Il размер выходного буфера
LPDWORD lpBytesRetn, // требуемый размер выходного буфера
гпава 16. Базовые функции Windows
487
DeviceloControl будет использовать lpBytesRetn. Однако после таких операций значение lpBytesRetn бессмысленно.
ЕСЛИ lpOverlapped НЄ раВНО null, ТО lpByteRetn МОЖЄТ бЫТЬ noll. ЕСЛИ
этот параметр не null и операция возвращает данные, то lpBytesRetn не имеет смысла, пока вызванная асинхронная операция не завершится. Для получения результата и числа возвращенных байтов используется вызов GetOverlappedResult. Если hDevice связан с портом ввода/вывода, то получить число возвращенных байтов можно с помощью функции GetQueuedCompletionStatus.
Предыдущая << 1 .. 140 141 142 143 144 145 < 146 > 147 148 149 150 151 152 .. 166 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100