我有一个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成员,并崩溃了。