Управляющий код FSCTL_OPBATCH_ACK_CLOSE_PENDING уведомляет сервер о том, что клиентское приложение собирается закрыть файл. Используйте эту операцию с последующим уведомлением, что уступающая блокировка в файле собирается быть разорванной.
Чтобы выполнить эту операцию, вызовите функцию DeviceIoControl, используя ниже перечисленные параметры.
BOOL DeviceIoControl( (HANDLE) hDevice, // дескриптор файла FSCTL_OPBATCH_ACK_CLOSE_PENDING, // dwIoControlCode NULL, // lpInBuffer 0, // nInBufferSize NULL, // lpOutBuffer 0, // nOutBufferSize (LPDWORD) lpBytesReturned, // возвращаемое число байтов (LPOVERLAPPED) lpOverlapped // структура OVERLAPPED ); |
[in] Дескриптор файла или выбранного потока, о котором делался запрос. Чтобы извлечь дескриптор файла, вызовите функцию CreateFile. Файл или выбранный поток, должны быть, открыты с флажком FILE_FLAG_OVERLAPPED. Этот дескриптор файла должен быть тем же самым дескриптором, из которого первоначально была затребована уступающая блокировка.
dwIoControlCode[in] Управляющий код операции. Для этой операции используйте FSCTL_OPBATCH_ACK_CLOSE_PENDING.
lpInBufferНе используется с этой операцией; устанавливается в NULL.
nInBufferSizeНе используется с этой операцией; устанавливается в нуль ('0').
lpOutBufferНе используется с этой операцией; устанавливается в NULL.
nOutBufferSizeНе используется с этой операцией; устанавливается в нуль ('0').
lpBytesReturned[out] Указатель на переменную, которая получает размер данных, сохраненных в буфере вывода данных, в байтах.
Если lpOverlapped - NULL, lpBytesReturned не может быть NULL. Даже тогда, когда операция не возвращает никакого вывода данных, а lpOutBuffer - NULL, DeviceIoControl использует lpBytesReturned. После такой операции, значение lpBytesReturned становится бессмысленным. Если lpOverlapped - не NULL, lpBytesReturned может быть NULL. Если этот параметр - не NULL, и операция возвращает данные, lpBytesReturned имеет значение не имеющего смысла до тех пор, пока асинхронная операция не завершиться. Чтобы извлечь информацию о числе возвращаемых данных, вызовите GetOverlappedResult. Если параметр hDevice связан с портом завершения ввода-вывода данных (I/O), Вы можете извлечь число возвращаемых данных при помощи вызова функции GetQueuedCompletionStatus.lpOverlapped
[in] Указатель на структуру OVERLAPPED. Если параметр hDevice открывался без определения флажка FILE_FLAG_OVERLAPPED, параметр lpOverlapped игнорируется.Если параметр hDevice открывался с флажком FILE_FLAG_OVERLAPPED, операция выполняется как перекрывающая (асинхронная) операция. В этой ситуации, параметр lpOverlapped должен указать на допустимую структуру OVERLAPPED, которая содержит дескриптор объекта события. В противном случае, функция завершается ошибкой непредсказуемыми способами.
Для асинхронных операций, DeviceIoControl возвращает значение немедленно, а объект события подает сигнал, когда операция завершается. В противном случае, функция не возвращает значение до тех пор, пока операция не завершится или не произойдет ошибка.
Если операция завершается успешно, DeviceIoControl возвращает ненулевое значение.
Если операция завершается ошибкой, DeviceIoControl возвращает нуль. Чтобы получить дополнительную информацию об ошибке, вызовите GetLastError.
Вам не следует делать предположения о числе доступных виртуальных каналов перед вызовом этой функции, потому что система и другие дополнительные программные модули, возможно, зарезервировали виртуальные каналы. Поэтому, вам следует всегда делать проверку для кода CHANNEL_RC_TOO_MANY_CHANNELS, возвращенного после вызова этой функции.
Включение асинхронного выполнения этой операции, смотри в разделе Замечаний описания функции DeviceIoControl.
Используйте управляющий код FSCTL_OPBATCH_ACK_CLOSE_PENDING тогда, когда Вы были уведомлены, что уступающая блокировка в файле собирается быть разорванной, а Вы намереваетесь вскоре закрыть файл. Эта операция не требует новой уступающей блокировки.
Если Вы не намереваетесь закрывать файл, Вы можете использовать или управляющий код FSCTL_OPLOCK_BREAK_ACKNOWLEDGE или FSCTL_OPLOCK_BREAK_ACK_NO_2, чтобы отреагировать на это уведомление. Первый используется тогда, если разрываемая блокировка - единственная уступающая блокировка, указывает, что файл должен получить уровень 2 уступающей блокировки вместо разорванного. Последний код требует, чтобы файл сохранялся открытым, но освобождаются все блокировки.
Приложения уведомляются, что уступающая блокировка разрывается, используя член hEvent структуры OVERLAPPED, связанной с файлом на котором разрывается уступающая блокировка. Приложения могут также использовать функции типа GetOverlappedResult и HasOverlappedIoCompleted.
Управляющие коды, используемые файловыми системами, Уступающие блокировки, DeviceIoControl, CreateFile, FSCTL_OPLOCK_BREAK_ACK_NO_2, FSCTL_OPLOCK_BREAK_ACKNOWLEDGE, GetOverlappedResult, HasOverlappedIoCompleted, OVERLAPPED
Размещение и совместимость FSCTL_OPBATCH_ACK_CLOSE_PENDING |
||
К | Windows XP |
Да |
л | Windows 2000 Professional |
Да |
и | Windows NT |
Нет |
е | Windows Me |
Нет |
н | Windows 98 |
Нет |
т | Windows 95 |
Нет |
С | Windows Server 2003 |
Да |
е | Windows 2000 Server | Да |
р | Windows NT Server | Нет |
в | ||
е | ||
р | ||
Используемая библиотека |
- |
|
Используемая DLL | - | |
Заголовочный файл | ||
- объявлено в |
Winioctl.h |
|
- включено в | - |
|
Unicode | - |
|
Замечания по платформе | Не имеется |