Нарушение доступа при вызове LockFileEx () - PullRequest
2 голосов
/ 08 октября 2011

У меня есть класс FileMapping, который позволяет мне также заблокировать файл для исключительного использования моим процессом с помощью функции Win32 API LockFileEx () .

bool FileMapping::lockFile(bool wait) {
    if (isFileLocked())
        return true;

    // We want an exclusive lock.
    DWORD flags = LOCKFILE_EXCLUSIVE_LOCK;

    // If we don't want the thread to block, we have to set the appropriate flag.
    if (!wait)
        flags |= LOCKFILE_FAIL_IMMEDIATELY;

    m_isFileLocked = LockFileEx(m_fileDesc, flags, 0, (DWORD) m_mappingLength, (DWORD) (((uint64_t) m_mappingLength) >> 32), NULL);
    return m_isFileLocked;
}

Всякий раз, когда я получаю вызов LockFileEx(), я получаю нарушение доступа:

Необработанное исключение в 0x7466c2ec в tftpServer.exe: 0xC0000005:
Место чтения нарушения доступа 0x00000008.

Дескриптор файла m_fileDesc определенно является допустимым дескриптором (отображение файла в память с помощью этого дескриптора работает), а m_mappingLength - это просто size_t, содержащий длину отображаемой части файла в байтах.

У кого-нибудь есть идеи, как это исправить?

Ответы [ 2 ]

4 голосов
/ 08 октября 2011

Ваш последний аргумент - NULL, в то время как он должен быть указателем на структуру OVERLAPPED.Ошибка о месте чтения 0x00000008, вероятно, соответствует задокументированному требованию, что:

Вы должны инициализировать элемент hEvent с допустимым дескриптором или нулем.

Учитывая hEventmember идет после двух указателей, в 32-битной компиляции это будет 8 байт от начала структуры.Поэтому LockFileEx, вероятно, пытается прочитать элемент hEvent и вылетает.

2 голосов
/ 08 октября 2011

Цитирование документов, на которые вы ссылаетесь:

lpOverlapped [in, out]

Указатель на структуру OVERLAPPED, которую функция использует с запросом на блокировку.Эта структура, , которая требуется , содержит смещение файла начала диапазона блокировки.Вы должны инициализировать член hEvent для допустимого дескриптора или нуля.

Таким образом, ваш последний аргумент неверен.

...