WPUQueueApc 函数将用户模式异步过程调用(APC)排队到指定的线程,以便于调用重叠的 I/O 完成例程。
Syntax
int WPUQueueApc(
[in] LPWSATHREADID lpThreadId,
[in] LPWSAUSERAPC lpfnUserApc,
[in] DWORD_PTR dwContext,
[out] LPINT lpErrno
);
参数
[in] lpThreadId
指向标识线程上下文的 WSATHREADID 结构的指针。 指向此结构的指针由 Ws2_32.dll 作为指向重叠作的输入参数提供给服务提供商。 提供程序应在本地存储 WSATHREADID 结构,并提供指向此本地存储的指针。 WPUQueueApc 返回后,不再需要 WSATHREADID 的本地副本。
[in] lpfnUserApc
指向要调用的 APC 函数的指针。
[in] dwContext
随后作为 APC 函数的输入参数提供的 32 位上下文值。
[out] lpErrno
指向错误代码的指针。
返回值
如果未发生错误, WPUQueueApc 将返回零,并将指定线程的完成例程排入队列。 否则,它将返回SOCKET_ERROR,并且 lpErrno 中提供了特定的错误代码。
| 错误代码 | Meaning |
|---|---|
| dwThreadId 参数未指定有效的线程。 |
注解
此函数针对指定的线程对 APC 函数进行排队。 在 Windows 下,将使用用户模式异步过程调用(APC)来完成此作。 仅当指定的线程在可警报等待中被阻止并且将直接进行回调时,APC 才会执行。 此调用在中断上下文中是安全的。
LPWSAUSERAPC 的定义如下:
typedef void ( CALLBACK FAR * LPWSAUSERAPC )( DWORD dwContext );
由于 APC 机制仅支持单个上下文值, 因此 lpfnUserApc 本身不能是客户端指定的完成例程,这涉及到更多参数。 服务提供商必须改为提供指向其自己的 APC 函数的指针,该函数使用提供的 dwContext 值访问重叠作所需的结果信息,然后调用客户端指定的完成例程。
对于用户模式组件实现重叠 I/O 的服务提供商,APC 机制的典型用法如下所示。
-
- I/O作完成后,提供程序会分配一个小缓冲区,并使用指向客户端提供的完成过程和参数值的指针打包它,以传递给该过程。
- 它将 APC 排队,将指向缓冲区的指针指定为 dwContext 值,并将自己的中间过程指定为目标过程 lpfnUserApc。
- 当目标线程最终进入可警报的等待状态时,服务提供程序的中间过程在正确的线程上下文中调用。
- 中间过程只是解包参数,解除分配缓冲区,并调用客户端提供的完成过程。
要求
| Requirement | 价值 |
|---|---|
| 最低支持的客户端 | Windows 2000 Professional [仅限桌面应用] |
| 支持的最低服务器 | Windows 2000 Server [仅限桌面应用] |
| 目标平台 | Windows操作系统 |
| Header | ws2spi.h |