【问题标题】:Access Violation when calling LockFileEx()调用 LockFileEx() 时访问冲突
【发布时间】:2011-10-08 14:14:08
【问题描述】:

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

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

【问题讨论】:

  • this 指针为空。您正在对空 FileMapping 对象调用此方法。

标签: c++ windows winapi file-locking


【解决方案1】:

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

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

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

【讨论】:

  • 糟糕,我一定忽略了这一点。我现在创建了一个 OVERLAPPED 结构并将其地址传递给 LockFileEx() 并且它可以工作。感谢您的帮助。
  • 我刚刚被同样的疏忽所困扰。在 MSDN 文档中它应该是 bold ! :)
【解决方案2】:

引用您链接到的文档:

lpOverlapped [输入,输出]

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

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

【讨论】:

  • 糟糕,我一定忽略了这一点。我现在创建了一个 OVERLAPPED 结构并将其地址传递给 LockFileEx() 并且它可以工作。谢谢您的帮助。如果size_t 是32 位,我知道第5 个参数的问题。这就是为什么我首先将它转换为 uint64_t,所以我有一个 64 位的值来执行移位。我知道在 32 位平台上这个参数应该总是为零,但我希望它在 32 位和 64 位平台上都能工作,这就是我选择演员表和班次的原因。
猜你喜欢
  • 2018-09-07
  • 2016-06-22
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多