当 GetQueuedCompletionStatus() 返回 FALSE 时,这些参数的值是多少?

Posted

技术标签:

【中文标题】当 GetQueuedCompletionStatus() 返回 FALSE 时,这些参数的值是多少?【英文标题】:What will be the values of these parameters when GetQueuedCompletionStatus() return FALSE? 【发布时间】:2015-02-27 15:47:00 【问题描述】:

有两个原因会导致GetQueuedCompletionStatus()失败(返回FALSE),第一个是因为与其关联的完成端口句柄在调用未完成时关闭,如果lpOverlapped就会出现这种情况是NULL

第二个原因(这是我关心的一个)是如果 IO 操作(例如:WSARecv())失败。这就是文档对这种情况的描述:

如果 *lpOverlapped 不为 NULL 并且函数将完成出列 来自完成端口的失败 I/O 操作的数据包, 函数将有关失败操作的信息存储在 lpNumberOfBytes、lpCompletionKey 和 lp重叠。要获取扩展的错误信息,请调用 GetLastError。

我发现这对于lpNumberOfByteslpCompletionKeylpOverlapped 的值将是什么不是很清楚。这些参数是否包含我在调用WSARecv() 时提供的相同值?我想这更有可能是因为我想怎么知道是什么 IO 操作导致了失败!

【问题讨论】:

【参考方案1】:

如果 I/O 操作失败,则 lpCompletionKeylpOverlapped 将是您使用所使用的任何 API(WSASend()WSARecv() 等)启动 I/O 操作时提供的值.这就是您识别相关 I/O 操作的“每个设备”数据和“每个操作”数据的方式。

lpNumberOfBytes 在错误情况下可能为零,尽管我倾向于像处理非错误情况一样处理它,因为无论如何我在错误处理期间从不使用结果值(或缓冲区内容)。

【讨论】:

以上是关于当 GetQueuedCompletionStatus() 返回 FALSE 时,这些参数的值是多少?的主要内容,如果未能解决你的问题,请参考以下文章

python当密码正确输入,当密码错误时

更新:为啥当用户是管理员时关系有效,但当普通用户时不会?

当位于顶级栏目显示下级栏目,当位于二级栏目显示同级栏目,当位于三级目录,显示上级栏目

当应用程序在后台时扫描外围设备(例如,当屏幕锁定时)

psp一骑当千交叉冲击金手指

当组长有感