По умолчанию LockFileEx блокируется, пока блокировка не будет получена (хотя вы можете сказать это не с LOCKFILE_FAIL_IMMEDIATELY).
Очевидно, что это не межплатформенная платформа.
Update
Этот ужасный пример кода показывает, что он работает (вы, возможно, потребуется изменить имя файла в CreateFile из «lockBlock.cpp»). Запустите один экземпляр программы, и он получит блокировку. Запустите второй экземпляр, и он будет заблокирован. Нажмите < enter> в первом случае, чтобы освободить блокировку, а второй экземпляр разблокирует и получит блокировку.
int _tmain(int argc, _TCHAR* argv[])
{
HANDLE hFile = ::CreateFileA("lockBlock.cpp", GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);
OVERLAPPED overlapped;
memset(&overlapped, 0, sizeof(overlapped));
const int lockSize = 10000;
printf("Taking lock\n");
if (!LockFileEx(hFile, LOCKFILE_EXCLUSIVE_LOCK, 0, lockSize, 0, &overlapped))
{
DWORD err = GetLastError();
printf("Error %i\n", err);
}
else
{
printf("Acquired lock\n");
getchar();
UnlockFileEx(hFile, 0, lockSize, 0, &overlapped);
printf("Released lock\n");
}
return 0;
}
Вы действительно хотите заблокировать файл или просто пытаетесь синхронизировать процессы? Если последний, то вы можете использовать глобальный мьютекс (т. Е. Использовать один и тот же параметр 'lpName' при вызове' CreateMutex' в разных процессах). –