调用LockFileEx()时发生访问冲突

Access Violation when calling LockFileEx()

本文关键字:访问冲突 LockFileEx 调用      更新时间:2023-10-16

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

tftpServer.exe中0x7466c2ec的未处理异常:0xC0000005:
读取位置0x00000008.

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

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

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

必须初始化hEvent成员为有效句柄或零。

如果hEvent成员位于两个指针之后,那么在32位编译时,它将位于结构体开头的8个字节处。因此,LockFileEx可能试图读取hEvent成员,并崩溃。

引用你所链接的文档:

lpoverlap [in, out]

指向一个OVERLAPPED结构体的指针,该结构体被函数用于锁定请求。这个结构是必需的,它包含锁范围开始的文件偏移量。必须将hEvent成员初始化为有效句柄或零。

所以你的最后一个论点是错误的