CreateEventW 函数 (synchapi.h)

创建或打开命名或未命名的事件对象。

若要为对象指定访问掩码,请使用 CreateEventEx 函数。

语法

HANDLE CreateEventW(
  [in, optional] LPSECURITY_ATTRIBUTES lpEventAttributes,
  [in]           BOOL                  bManualReset,
  [in]           BOOL                  bInitialState,
  [in, optional] LPCWSTR               lpName
);

参数

[in, optional] lpEventAttributes

指向 SECURITY_ATTRIBUTES 结构的指针。 如果此参数 NULL,则子进程无法继承句柄。

结构的 lpSecurityDescriptor 成员为新事件指定 安全描述符。 如果 lpEventAttributesNULL,则该事件将获取默认的安全描述符。 事件的默认安全描述符中的 ACL 来自创建者的主要或模拟令牌。

[in] bManualReset

如果此参数 TRUE,该函数将创建一个手动重置事件对象,该对象需要使用 ResetEvent 函数将事件状态设置为非对齐状态。 如果此参数 FALSE,则函数将创建一个自动重置事件对象,并且系统会在释放单个等待线程后自动将事件状态重置为非对齐状态。

[in] bInitialState

如果此参数 TRUE,则表示事件对象的初始状态;否则,它将不对齐。

[in, optional] lpName

事件对象的名称。 名称限制为 MAX_PATH 个字符。 名称比较区分大小写。

如果 lpName 与现有命名事件对象的名称匹配,此函数将请求 EVENT_ALL_ACCESS 访问权限。 在这种情况下,bManualResetbInitialState 参数将被忽略,因为它们已被创建过程设置。 如果 lpEventAttributes 参数未 NULL,则确定是否可以继承句柄,但忽略其安全描述符成员。

如果 lpNameNULL,则会创建事件对象而不指定名称。

如果 lpName 匹配同一命名空间中另一种对象的名称(例如现有的信号灯、互斥体、可等待计时器、作业或文件映射对象),则函数将失败,GetLastError 函数返回 ERROR_INVALID_HANDLE。 之所以发生这种情况,是因为这些对象共享相同的命名空间。

该名称可以具有“全局”或“本地”前缀,以在全局或会话命名空间中显式创建对象。 名称的其余部分可以包含除反斜杠字符(\)以外的任何字符。 有关详细信息,请参阅 内核对象命名空间。 快速用户切换是使用终端服务会话实现的。 内核对象名称必须遵循终端服务概述的准则,以便应用程序能够支持多个用户。

可以在专用命名空间中创建对象。 有关详细信息,请参阅 对象命名空间

返回值

如果函数成功,则返回值是事件对象的句柄。 如果在函数调用之前存在命名事件对象,该函数将返回现有对象的句柄,GetLastError 返回 ERROR_ALREADY_EXISTS

如果函数失败,则返回值 NULL。 若要获取扩展的错误信息,请调用 GetLastError

言论

CreateEvent 返回的句柄具有 EVENT_ALL_ACCESS 访问权限;它可用于需要事件对象的句柄的任何函数,前提是调用方已被授予访问权限。 如果事件是从服务或模拟其他用户的线程创建的,则可以在创建事件时向其应用安全描述符,或者通过更改其默认 DACL 来更改创建过程的默认安全描述符。 有关详细信息,请参阅 同步对象安全和访问权限

调用过程的任何线程都可以在调用其中一个 等待函数中指定事件对象句柄。 当发出指定对象的状态发出信号时,单对象等待函数将返回。 可以指示多对象等待函数在发出任何一个或发出所有指定对象的信号时返回。 当等待函数返回时,等待线程将释放以继续执行。

事件对象的初始状态由 bInitialState 参数指定。 使用 SetEvent 函数将事件对象的状态设置为信号。 使用 ResetEvent 函数将事件对象的状态重置为非对齐状态。

当手动重置事件对象的状态发出信号时,它将保持信号,直到它被 ResetEvent 函数显式重置为非对齐状态。 在发出对象状态信号时,可以释放任意数量的等待线程或随后开始指定事件对象的等待操作的线程。

当自动重置事件对象的状态发出信号时,它将保持信号,直到释放单个等待线程;然后,系统会自动将状态重置为非对齐状态。 如果没有线程正在等待,事件对象的状态将保持信号。

多个进程可以包含同一事件对象的句柄,从而允许使用该对象进行进程间同步。 可以使用以下对象共享机制:

  • 如果 lpEventAttributes CreateEvent 启用继承的 lpEventAttributes 参数,则 CreateProcess 函数创建的子进程可以继承事件对象的句柄。
  • 进程可以在调用 DuplicateHandle 函数时指定事件对象句柄,以创建可由另一个进程使用的重复句柄。
  • 进程可以在调用 OpenEventCreateEvent 函数中指定事件对象的名称。
使用 CloseHandle 函数关闭句柄。 系统在进程终止时自动关闭句柄。 事件对象在关闭其最后一个句柄时被销毁。

例子

有关使用 createEvent的示例,请参阅 使用事件对象

注意

synchapi.h 标头将 CreateEvent 定义为一个别名,该别名根据 UNICODE 预处理器常量的定义自动选择此函数的 ANSI 或 Unicode 版本。 将中性编码别名与不中性编码的代码混合使用可能会导致编译或运行时错误不匹配。 有关详细信息,请参阅函数原型的 约定。

要求

要求 价值
最低支持的客户端 Windows XP [桌面应用 |UWP 应用]
支持的最低服务器 Windows Server 2003 [桌面应用 |UWP 应用]
目标平台 窗户
标头 synchapi.h (包括 Windows Server 2003、Windows Vista、Windows 7、Windows Server 2008 Windows Server 2008 R2 上的 Windows.h)
Kernel32.lib
DLL Kernel32.dll

另请参阅

CloseHandle

CreateEventEx

CreateProcess

DuplicateHandle

事件对象

对象名称

OpenEvent

ResetEvent

SECURITY_ATTRIBUTES

SetEvent

同步函数