我有一个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
,包含映射文件部分的长度字节。
有人知道如何解决这个问题吗?
答案 0 :(得分:4)
你的最后一个参数是NULL
,而它应该是指向OVERLAPPED
结构的指针。读取位置0x00000008的错误可能对应于以下记录的要求:
您必须将hEvent成员初始化为有效句柄或零。
鉴于hEvent
成员在两个指针之后出现,在32位编译中它从结构的开头起是8个字节。所以LockFileEx
可能正在尝试读取hEvent成员,并崩溃。
答案 1 :(得分:2)
引用您链接的文档:
lpOverlapped [in,out]
指向函数与锁定请求一起使用的OVERLAPPED结构的指针。此结构是必需的,包含锁定范围开头的文件偏移量。您必须将hEvent成员初始化为有效句柄或零。
所以你的最后一个论点是错误的。