调用LockFileEx()时发生访问冲突
Access Violation when calling LockFileEx()
我有一个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
。
有人知道如何解决这个问题吗?
您的最后一个参数是NULL
,而它应该是指向OVERLAPPED
结构的指针。关于读取位置0x00000008的错误可能对应于文档要求:
必须初始化hEvent成员为有效句柄或零。
如果hEvent
成员位于两个指针之后,那么在32位编译时,它将位于结构体开头的8个字节处。因此,LockFileEx
可能试图读取hEvent成员,并崩溃。
引用你所链接的文档:
lpoverlap [in, out]
指向一个OVERLAPPED结构体的指针,该结构体被函数用于锁定请求。这个结构是必需的,它包含锁范围开始的文件偏移量。必须将hEvent成员初始化为有效句柄或零。
所以你的最后一个论点是错误的
相关文章:
- 写入位置0x0000000C时发生访问冲突
- 引发异常:读取访问冲突**dynamicArray**为0x1118235.发生
- 链表中写入访问冲突的未知原因
- C++中的openCV Mat访问冲突
- C++尝试深度复制唯一指针时出现内存访问冲突
- C++ 中动态二维数组的访问冲突
- 从嵌套循环中的 std::list 中删除将返回访问冲突
- 写入访问冲突异常
- 在类 12.exe 中0x7B37FF80 (ucrtbased.dll) 引发异常: 0xC0000005:访问冲突读
- 0xC0000005:访问冲突写入位置0xCDCDCDCD动态分配错误
- 读取访问冲突.这0xCDCDCDCD
- 0xC0000005:访问冲突读取位置 0x00000000. 重载 == 运算符的问题
- 插入数组时违反写访问冲突
- 使用 ReadProcessMemory 获取字符串值的访问冲突
- 尝试通过共享指针使用变量时读取访问冲突
- 堆栈上的 C++ 访问冲突写入异常
- 引发异常:写访问冲突. temp 为 nullptr
- 将静态字符数组中的字符分配给动态分配的字符数组 - 访问冲突
- 在C++中删除双向链表的头节点后出现访问冲突异常
- 调用LockFileEx()时发生访问冲突