首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

第二次调用时返回INVALID_HANDLE的ReadFile

ReadFile是Windows操作系统提供的一个函数,用于从文件或输入/输出(I/O)设备中读取数据。它的原型如下:

代码语言:txt
复制
BOOL ReadFile(
  HANDLE       hFile,
  LPVOID       lpBuffer,
  DWORD        nNumberOfBytesToRead,
  LPDWORD      lpNumberOfBytesRead,
  LPOVERLAPPED lpOverlapped
);

参数说明:

  • hFile:要读取的文件或设备的句柄。
  • lpBuffer:用于存储读取数据的缓冲区。
  • nNumberOfBytesToRead:要读取的字节数。
  • lpNumberOfBytesRead:实际读取的字节数。
  • lpOverlapped:指向一个OVERLAPPED结构的指针,用于异步操作。

根据题目描述,第二次调用ReadFile时返回INVALID_HANDLE,这意味着在第一次调用ReadFile之后,文件或设备的句柄已经无效。INVALID_HANDLE是一个常量,表示无效的句柄。

造成INVALID_HANDLE的原因可能有多种,例如:

  1. 第一次调用ReadFile时未正确打开文件或设备,导致句柄无效。
  2. 第一次调用ReadFile后,文件或设备被关闭或释放,导致句柄无效。
  3. 第一次调用ReadFile后,句柄被其他操作修改或关闭,导致句柄无效。

为了解决这个问题,可以进行以下检查和修复:

  1. 确保在调用ReadFile之前正确打开文件或设备,并获取有效的句柄。
  2. 检查第一次调用ReadFile之后,句柄是否被关闭或释放。如果是,需要重新打开文件或设备,并获取新的句柄。
  3. 检查第一次调用ReadFile之后,句柄是否被其他操作修改或关闭。如果是,需要重新获取句柄或重新打开文件或设备。

腾讯云相关产品和产品介绍链接地址: 腾讯云提供了丰富的云计算产品和服务,包括云服务器、云数据库、云存储等。您可以访问腾讯云官方网站(https://cloud.tencent.com/)了解更多详情。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Ajax处理success回函数返回json数据。

站长最近在项目中用调用一个分类子数据,由于表单要填写数据较多,为了实现无刷新选择操作,就使用ajax做了异步查询。...最好是直接返回字符串或者json。...开始做时候想着,直接用PHP把数组处理好,返回给前端就好直接用了,所以对查询结果进行json编码,这个很简单,利用PHP内置json操作函数json_encode对array进行编码操作,然后return...原本想着直接使用返回json数据去遍历填充页面了,万万没想到,折腾好大一会儿没成功。使用alert弹了下返回data,完整显示是一个json呐,为毛就遍历不到呢。...在json章节中找到了这段: 这就简单了,现在只需将success返回data丢到eval函数中就完事了,所以站长就匆匆写下这句var dataObj = eval("("+data+")");就操作后续重写

3.4K20

你真的了解回?

前言 你将在本文中,学习到什么是回,回是一种异步操作手段,在平时使用当中无处不在,究竟如何确定何时使用异步(跳跃式执行,稍后响应,发送一个请求,不等待返回,随时可以再发送下一个请求,例如订餐拿号等饭...,发广播,QQ,微信等聊天)还是同步(顺序执行,逐行读取代码,会影响后续功能代码,也就是发送一个请求,等待返回,然后再发送下一个请求,比如打电话,需要等到你女票回话了,才能继续下面虐狗情节),回重要不言而喻...当函数被调用时,它立即将数字加1,所以我们可以预期,在我们调用函数后,数字应该是2.这是对同步代码期望 - 它从头到尾依次运行 但是,Node主要使用异步代码。...这是了解异步编程基本知识。当addOne被调用时,它会启动一个readFile,然后继续下一个准备执行事情。...只有函数可以被调用,所以如果你传入除函数以外任何东西,它将会导致错误 当一个函数被javascript调用时,该函数中代码将立即执行。

87330
  • Node.js 异步异闻录

    从 Promise 链式调用可以清晰地看到队列(先进先出)知识,其有如下两个核心步骤: 将所有的回都存到队列中; Promise 完成时,逐个执行回,一旦检测到返回了新 Promise 对象,停止执行...Thunk 函数例子如下: // 正常版本 readFile(多参数) fs.readFile(filename, 'utf8', callback) // Thunk 版本 readFile(...次,result 值第一次是空值,第二次是 file1.txt 内容 I'm file1,第三次是 file2.txt 内容 I'm file2。...根据上述关键语句提醒,所以第二次内容会作为 file1 值(当作上一个yield语句返回值),同理第三次内容会作为 file2 值。...async 函数返回值是 Promise 对象,比 Generator 函数返回 Iterator 对象方便,因此可以直接使用 then() 方法进行调用; 参考资料 深入浅出 Node.js 理解回函数

    2.3K80

    nodejs(一)

    , (change directory) cd …/ ⇒ 退回上级文件夹 clear ⇒ 清屏 esc ⇒ 清除当前这一行 global模块 node全局模块,在使用时不需要引入,直接使用。...) fs(file system)文件系统 注意:除了global模块中内容,其他模块在使用时都要先引入 读取文件 语法: fs.readFile('文件路径', '【可选参数(即编码方式)】...' ,读取文件函数) 读取文件函数: 接收两个参数 错误对象, 如果读取失败了, err会包含错误信息, 如果读取成功了, err 是一个null 读取后返回数据 (默认是buffer对象...零长度 path 片段被忽略。 如果连接路径字符串是零长度字符串,则将返回 '.',表示当前工作目录。...(url)) extname()方法 path.extname()方法返回 path扩展名,即 path 最后一部分中从最后一次出现 .

    56520

    如何在 Node.js 中判断一个文件是否存在?

    为什么不推荐 fs.exists 我们在设计一个回函数时,通常会遵循一个原则 “ 错误优先函数”,也就是返回第一个参数为错误信息,用以验证是否出错,其它参数则用于返回数据。...如下所示为 fs.exists 使用示例,直接返回了一个布尔值,违背了 “错误优先函数” 这一设计原则,这是一方面原因。...does not exists'); } else { throw err; } } })(); 目前 fs.exists 已被废弃,另外需要清楚, 只有在文件不直接使用时才去检查文件是否存在...使用 fs.stat fs.stat 返回一个 fs.Stats 对象,该对象提供了关于文件很多信息,例如文件大小、创建时间等。...'不存在' : '只可读'}`); } else { console.log(`${file} 存在,且可写`); } }); 同样也不推荐在 fs.open()、 fs.readFile

    23.9K51

    Generator函数

    先看使用Generator函数生成迭代器a: 第一次调用next方法,遇到 yield 停止,返回yield表达式值,此时为 5 + 1 = 6; 第二次调用next方法,遇到 yield 停止,返回...,此时为 5 + 1 = 6; 第二次调用next方法,遇到 yield 停止,返回yield表达式值,由于next方法带有参数12,所以上一个yield表达式返回值为12, 因此y值等于2*12即...V8引擎直接忽略第一次使用 next方法时参数,只有从第二次使用next方法开始,参数才是有效。从语义上讲,第一个 next方法用来启动迭代器对象,所以不用带有参数。...回函数本身并没有问题,它问题出现在多个回函数嵌套。...Promise // fs-readfile-promise模块,它作用就是返回一个 Promise 版本readFile函数。

    1K30

    JS高阶(一)Promise

    指定回函数方式更加灵活 旧:必须在启动异步任务前指定 promise:启动异步任务=>返回promise对象=>给promise对象绑定回函数(甚至可以在异步任务结束后指定多个) 支持链式调用,...简单表达:由then指定函数执行结果决定; 详细表达: 如果抛出异常,新 promise 变为 rejected,reason 为抛出异常; 如果返回任意非 promise 值,新 promise...undefined }); promise 异常穿透 当使用 promise then 链式调用时,可以在最后指定失败; 在前部出现所有异常都会穿透至最后失败回中; let p =...then 链式调用时,在中间中断,不再调用后面的函数; 方法:在回函数中返回一个状态为 pending promise 对象; let p = new Promise((resolve, reject...); //使用回函数方式取html文件 fs.readFile('.

    2.4K10

    WPF 命令自动刷新时机——当你 CanExecute 会返回 true 但命令依旧不可用时可能是这些原因

    这样,按钮可用性会自动根据 WalterlvCommand 当前 CanExecute 状态来改变。...这本是一个非常智能特性,直到你可能发现你按钮可用性状态不正确…… 本文介绍默认情况下,WPF 在 UI 上这些命令会在什么时机进行刷新;以及没有及时刷新时,可以如何强制让这些命令可用性状态进行刷新...在鼠标的左键或者右键松开时候 在任何一个控件获得键盘焦点或者失去键盘焦点时候 这部分代码可以在这里查看: CommandDevice.PostProcessInput 最关键代码贴在这里: 1...,比如这些: 在 Menu 菜单子菜单项打开时候(参见 MenuItem.OnIsSubmenuOpenChanged) 在长按滚动条中按钮以连续滚动过程中(参见 Tracker.DecreaseRepeatButton...) 在 DataGridCell 只读属性改变时候(参见 DataGridCell.OnNotifyIsReadOnlyChanged) 在 DataGrid 中各种各样操作中(参见 DataGrid

    98430

    【译】《Understanding ECMAScript6》- 第七章-Promise

    ; 上述代码使用Node.js经典error-first回函数。readFile()函数从硬盘中检索第一个参数指定文件,检索完毕后执行第三个参数指定函数。...本例中回函数工作流程如下:运行readFile()函数后,readFile()在从硬盘中检索文件时暂停占用JavaScript线程;随后console.log("Hi!")...立即执行;当readFile()检索完毕之后,将第二个参数指定函数加入JavaScript执行序列末尾等待执行。 回函数模式优于事件驱动一点是,回函数模式可以链式操作。...与事件驱动模式响应函数和回函数模式函数不同,Promise机制下异步函数返回一个Promise,如下: // readFile promises to complete at some point...需要注意是,当readFile()被调用时,executor并非立即执行,而是被加入执行序列中延后执行。

    2.1K60

    这次我们来聊聊它是如何被实现

    所以此时首次调用 g.next() 函数返回应该是 { value: 1, done: false }。 之后,我们第二次调用 g.next() 方法时,函数会从上一次中断结果后进行执行。...当第二次调用 g.next() 方法时,生成器函数会继续从上一次暂停语句开始执行。...总而言之,当我们为 next 传递值进行调用时,传入值会被当作上一次生成器函数暂停时 yield 关键字返回值处理。 自然,第一次调用 g.next() 传入参数是毫无意义。...switch中下标 sent: '', // 表示next调用时候传入值 作为上一次yield返回值 done: false, // 是否完成 // 完成函数...Promise 帮助我们解决了非常糟糕“回地狱”式异步解决方案。

    74320

    如何在 Node.js 中流式处理大 JSON 文件

    { "list": [], "otherList": [] } 在 Node.js 中我们可以基于以下几种方式读取数据,也是通常首先能够想到: fs.readFile():这个是一次性读取数据到内存...实现了 SAX 解析器拥有事件驱动那样 API,像 Stream 方式来工作,边读取边解析,用户可以定义回函数获取数据,无论 XML 内容多大,内存占用始终都会很小。 这对我们本节有什么帮助?...JSON 是有自己标准,有规定数据类型、格式。这个 JSON 解析器也是在解析到特定格式或类型后触发相应事件,我们在使用时也要注册相应函数。...,这个 data 事件也是该模块自己处理过,每次会为我们返回一个对象: 第一次返回 { id: 1 } 第二次返回 { id: 2 } const fs = require('fs'); const...第一次返回 { name: '1' } 第二次返回 { name: '2' } (async () => { const readable = fs.createReadStream('.

    3.8K20

    驱动开发:通过ReadFile与内核层通信

    ReadFile系列函数实现通信模式。...缓冲区方式读写(DO_BUFFERED_IO)直接方式读写(DO_DIRECT_IO)其他方式读写而通过ReadFile,WriteFile系列函数实现通信机制则属于缓冲区通信模式,在该模式下操作系统会将应用层中数据复制到内核中...,此时应用层调用ReadFile,WriteFile函数进行读写时,在驱动内会自动触发 IRP_MJ_READ 与 IRP_MJ_WRITE这两个派遣函数,在派遣函数内则可以对收到数据进行各类处理。...用时初始化其他派遣用,也就是将除去CREATE/CLOSE这两个派遣之外,其他全部赋值成初始值意思,当然不增加此段代码也是无妨,并不影响代码实际执行。...LySharkDriver");Status = IoCreateSymbolicLink(&SymLinkName, &DriverName);return STATUS_SUCCESS;}// 创建回函数

    40330

    驱动开发:通过ReadFile与内核层通信

    ReadFile系列函数实现通信模式。...缓冲区方式读写(DO_BUFFERED_IO) 直接方式读写(DO_DIRECT_IO) 其他方式读写 而通过ReadFile,WriteFile系列函数实现通信机制则属于缓冲区通信模式,在该模式下操作系统会将应用层中数据复制到内核中...,此时应用层调用ReadFile,WriteFile函数进行读写时,在驱动内会自动触发 IRP_MJ_READ 与 IRP_MJ_WRITE这两个派遣函数,在派遣函数内则可以对收到数据进行各类处理。...用时初始化其他派遣用,也就是将除去CREATE/CLOSE这两个派遣之外,其他全部赋值成初始值意思,当然不增加此段代码也是无妨,并不影响代码实际执行。...// 读取回函数 NTSTATUS DispatchRead(PDEVICE_OBJECT pDevObj, PIRP pIrp) { NTSTATUS Status = STATUS_SUCCESS

    47310

    细说JS异步发展历程

    所谓同步,就是在发出一个"调用"时,在没有得到结果之前,该“调用”就不返回。但是一旦调用返回,就得到返回值了。换句话说,就是由“调用者”主动等待这个“调用”结果。...此调用执行完之前,阻塞之后代码执行。 2.什么是异步? "调用"在发出之后,这个调用就直接返回了,没有返回结果。换句话说,当一个异步过程调用发出后,调用者不会立刻得到结果。...异步最早解决方案是回函数,如事件,setInterval/setTimeout中。...但是回函数有一个很常见问题,就是回地狱问题(稍后会举例说明); 为了解决回地狱问题,社区提出了Promise解决方案,ES6将其写进了语言标准。...那么我们看看Promise是如何解决回地狱问题,仍然以上文readFile 为例(先读取A文本内容,再根据A文本内容读取B再根据B内容读取C)。

    2.3K21

    node.jsasync和await

    async函数返回是一个Promise对象,可以使用then方法添加回函数,一旦遇到await就会先返回。...二、node异步编程演进四个阶段 我们来回顾一下异步编程写法演进过程 第一阶段 通过回函数 fs.readFile('/etc/passwd', 'utf-8', function (err,...第二阶段 通过Promise Promise 对象允许将回函数嵌套,改成链式调用。 采用 Promise,连续读取多个文件,写法如下。...(fileA); // ...其他代码 } 函数asyncJob是一个协程,协程遇到yield命令就暂停,等到执行权返回,再从暂停地方继续往后执行,这样写法非常像同步操作。...async表示函数里有异步操作,await表示在后面的表达式需要等待结果 async函数返回值是Promise对象 await后面,可以是Promise对象和原始类型值(数值、字符串和布尔值,会自动转换成

    1.4K30
    领券