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。 发生这种情况的原因是这些对象共享相同的命名空间。

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

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

返回值

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

如果函数失败,则返回值为 NULL。 要获得更多的错误信息,请调用 GetLastError。

注解

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

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

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

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

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

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

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

示例

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

注意

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

要求

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

另请参阅

CloseHandle

CreateEventEx

CreateProcess

DuplicateHandle

事件对象

对象名称

OpenEvent

ResetEvent

SECURITY_ATTRIBUTES

SetEvent

同步函数