2

我有一个 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包含映射文件部分的长度(以字节为单位)。

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

4

2 回答 2

4

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

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

鉴于该hEvent成员位于两个指针之后,在 32 位编译中,它将是结构开头的 8 个字节。所以LockFileEx可能是试图读取 hEvent 成员,然后崩溃。

于 2011-10-08T14:22:26.850 回答
2

引用您链接到的文档:

lpOverlapped [输入,输出]

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

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

于 2011-10-08T14:22:48.733 回答