CancelIoEx 函数

标记指定文件句柄的任何未完成的 I/O 操作。 函数仅取消当前进程中的 I/O 操作,而不考虑创建 I/O 操作的线程。

语法

BOOL WINAPI CancelIoEx(
  _In_     HANDLE       hFile,
  _In_opt_ LPOVERLAPPED lpOverlapped
);

parameters

hFile [in]

文件的句柄。

lpOverlapped [in, optional]

指向包含用于异步 I/O 的数据的 OVERLAPPED 数据结构的指针。

如果此参数为 NULL,则会取消 hFile 参数的所有 I/O 请求。

如果此参数不为 NULL,则只有为具有指定 lpOverlapped 重叠结构的文件发出的特定 I/O 请求标记为已取消,这意味着可以取消一个或多个请求,而 CancelIo 函数将取消文件句柄上所有未完成的请求。

返回值

如果该函数成功,则返回值为非零值。 已成功请求由指定文件句柄的调用进程发出的所有挂起 I/O 操作的取消操作。 在取消的 I/O 操作之前,应用程序不得释放或重复使用与已取消的 I/O 操作关联的 OVERLAPPED 结构。 线程可以使用 GetOverlappedResult 函数来确定 I/O 操作本身的完成时间。

如果函数失败,则返回值为 0 (零) 。 若要获取扩展错误信息,请调用 GetLastError 函数。

如果此函数找不到取消请求,则返回值为 0 (零) , GetLastError 返回 ERROR_NOT_FOUND

备注

通过 CancelIoEx 函数,可以取消调用线程以外的线程中的请求。 CancelIo 函数仅取消调用 CancelIo 函数的同一线程中的请求。 CancelIoEx 仅取消句柄上的未完成 I/O,它不会更改句柄的状态;这意味着不能依赖于句柄的状态,因为无法知道操作是成功完成还是已取消。

如果指定文件句柄有任何挂起的 I/O 操作正在进行中, 则 CancelIoEx 函数将其标记为取消。 大多数类型的操作都可以立即取消;其他操作可以在实际取消并通知调用方之前继续完成。 CancelIoEx 函数不会等待所有取消的操作完成。

如果文件句柄与完成端口关联,则如果同步操作成功取消,则 I/O 完成数据包不会排队到该端口。 对于仍处于挂起状态的异步操作,取消操作会将 I/O 完成数据包排队。

正在取消的操作以三种状态之一完成:必须检查完成状态才能确定完成状态。 这三种状态为:

  • 操作正常完成。 即使已取消操作,也会发生这种情况,因为取消请求可能尚未及时提交以取消操作。
  • 该操作已取消。 GetLastError 函数返回ERROR_OPERATION_ABORTED
  • 操作失败,出现另一个错误。 GetLastError 函数返回相关的错误代码。

在Windows 8和Windows Server 2012中,以下技术支持此功能。

技术 支持
服务器消息块 (SMB) 3.0 协议

SMB 3.0 透明故障转移 (TFO)

具有横向扩展文件共享的 SMB 3.0 (SO)

群集共享卷文件系统 (CsvFS)

弹性文件系统 (ReFS)

要求

要求
最低受支持的客户端
Windows Vista [桌面应用 |UWP 应用]
最低受支持的服务器
Windows Server 2008 [桌面应用 |UWP 应用]
标头
IoAPI.h (包括 Windows.h) ;
Windows Server 2008 R2、Windows 7、Windows Server 2008 和 Windows Vista 上的 WinBase.h (包括 Windows.h)

Kernel32.lib
DLL
Kernel32.dll

另请参阅

CancelIo

CancelSynchronousIo

取消挂起的 I/O 操作

文件管理功能

同步和异步 I/O