Добрый вечер. Объясните пожалуйста следующее: Code (Text): BOOL LockFileEx( HANDLE hFile, // дескриптор файла DWORD dwFlags, // параметры блокировки DWORD dwReserved, // зарезервировано DWORD nNumberOfBytesToLockLow, // младшая часть длины DWORD nNumberOfBytesToLockHigh, // старшая часть длины LPOVERLAPPED lpOverlapped // начальное смещение содержания ); Последние три параметра, зачем они нужны? Это что, получается, я могу блокировать доступ к определенным байтам в файле, или как? Не могу понять. Заранее спасибо.
Code (Text): NTSTATUS NtLockFile( __in HANDLE FileHandle, __in_opt HANDLE Event, __in_opt PIO_APC_ROUTINE ApcRoutine, __in_opt PVOID ApcContext, __out PIO_STATUS_BLOCK IoStatusBlock, __in PLARGE_INTEGER ByteOffset, __in PLARGE_INTEGER Length, __in ULONG Key, __in BOOLEAN FailImmediately, __in BOOLEAN ExclusiveLock ) /*++ Routine Description: This service locks a specified range of bytes on the file specified by the FileHandle parameter. The lock may either be an exclusive lock or a shared lock. Furthermore, the caller has the option of specifying whether or not the service should return immediately if the lock cannot be acquired without waiting. Arguments: FileHandle - Supplies a handle to an open file. Event - Supplies an optional event to be set to the Signaled state when the operation is complete. ApcRoutine - Supplies an optional APC routine to be executed when the operation is complete. ApcContext - Supplies a context parameter to be passed to the ApcRoutine, if an ApcRoutine was specified. IoStatusBlock - Address of the caller's I/O status block. ByteOffset - Specifies the starting byte offset of the range to lock. Length - Specifies the length of the byte range to be locked. Key - Specifies the key to be associated with the lock. FailImmediately - Specifies that if the lock cannot immediately be acquired that the service should return to the caller. ExclusiveLock - Specifies, if TRUE, that the lock should be an exclusive lock; otherwise the lock is a shared lock. Return Value: The status returned is success if the operation was properly queued to the I/O system. Once the operation completes, the status can be determined by examining the Status field of the I/O status block. --*/
Эта виньапи обёртка для сервиса ядра. А ядерные сервисы чётко описаны. Вот выше пример, который не нуждается в комментариях.
из этого следует, что я задаю последовательность байтов, которые нужно залочить. написал программу: Code (Text): INT _tmain(INT argc, LPTSTR argv[]) { HANDLE file = CreateFile(L"D:\\File1.txt", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, NULL, NULL); if(file != INVALID_HANDLE_VALUE) { OVERLAPPED overlapped; overlapped.Offset = 0; overlapped.OffsetHigh = 0; overlapped.hEvent = 0; LockFileEx(file, LOCKFILE_EXCLUSIVE_LOCK, NULL, 1, 0, &overlapped); } while(1); } мало того, что с параметром LOCKFILE_EXCLUSIVE_LOCK файл все равно открывается. Но я задал в OVERLAPPED начало смещения 0. Как длину я передал 1. получается, что залочиться должен был только первый байт. но не правится ничего. Вот здесь у меня проблемы с пониманием
Из описания непонятно, является ли блокировка мягкой (скажем, как в юнихе), или жесткой. Мягкая - как светофор, если кто на него не смотрит, поедет не только на желтый, но даже и на красный.