调用LockFileEx()时访问冲突

时间:2011-10-08 14:14:09

标签: c++ windows winapi file-locking

我有一个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,包含映射文件部分的长度字节。

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

2 个答案:

答案 0 :(得分:4)

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

  

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

鉴于hEvent成员在两个指针之后出现,在32位编译中它从结构的开头起是8个字节。所以LockFileEx可能正在尝试读取hEvent成员,并崩溃。

答案 1 :(得分:2)

引用您链接的文档:

  

lpOverlapped [in,out]

     
    

指向函数与锁定请求一起使用的OVERLAPPED结构的指针。此结构是必需的,包含锁定范围开头的文件偏移量。您必须将hEvent成员初始化为有效句柄或零。

  

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