我有一个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()调用时,都会遇到访问冲突:



文件句柄m_fileDesc绝对是有效的句柄(使用该句柄将文件映射到内存中),并且m_mappingLength只是size_t,其中包含以字节为单位的映射文件部分的长度。

有人知道如何解决此问题吗?

最佳答案

您的最后一个参数是NULL,而它应该是OVERLAPPED结构的指针。关于读取位置0x00000008的错误可能与记录的要求相对应:



给定hEvent成员位于两个指针之后,在32位编译中,从结构开始起需要8个字节。因此LockFileEx可能正在尝试读取hEvent成员,并崩溃了。

10-08 05:13