CreateEvent

고 연우·2022년 11월 3일
0

C++

목록 보기
4/4

🔶Syntax

HANDLE CreateEventA(
  [in, optional] LPSECURITY_ATTRIBUTES lpEventAttributes,
  [in]           BOOL                  bManualReset,
  [in]           BOOL                  bInitialState,
  [in, optional] LPCSTR                lpName
);

lpEventAttributes

  • SECURITY_ATTRIBUTES 구조체로 선언된 변수의 주소를 명시.
typedef struct _SECURITY_ATTRIBUTES {
   	DWORD nLength;
   	LPVOID lpSecurityDescriptor;
   	BOOL bInheritHandle;
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;
  • NULL 명시 시, 생성된 이벤트 객체의 핸들은 자식 프로세스에 상속되지 않으며 일반적인 보안 기술자가 명시된 걸로 간주함.
    • 현재 로그인되어 있는 사용자의 로그인 정보에 있는 ACL 또는 이벤트 객체를 생성한 프로세스의 ACL을 가져와 사용.

bManualReset

  • TRUE 이면, 발생된 이벤트 정보가 계속 유지되는 이벤트 객체를 생성( 다시 FALSE 값을 설정하기 전까지 계속 TRUE 값 유지 )
  • FALSE 이면, 일정 조건 만족 시 자동으로 객체에 설정된 상태 값이 TRUE에서 FALSE로 변경되는 이벤트 객체 생성
    • 이벤트 객체에 TRUE 값이 설정되고 이벤트 객체의 상태를 확인하는 함수가 사용되면 이벤트 객체의 상태값이 TRUE에서 FALSE로 변경 됨.

bInitialState
생성될 이벤트 객체의 TRUE 또는 FALSE 초깃값 설정. 이벤트 객체는 생성과 함께 이 상태 값을 가지게 됨.

LPCTSTR lpName
이벤트 객체에 사용할 이름 명시

  • 이름의 길이는 MAX_PATH, 대소문자 구별
  • 같은 프로세스 내에 있는 스레드 간끼리 사용할 경우, NULL 사용 가능하나 서로 다른 프로세스에 있는 스레드 간에 이벤트 객체를 공유하고 싶다면 동일한 이름 적어서 사용 가능
    • 동일한 이름을 사용하여 이벤트 객체 공유 시, 먼저 만들어진 이벤트 객체의 정보가 우선시되며 나중에 사용한 CreateEvent 함수의 bManualReset, bInitialState의 값은 무시 됨.
  • 명시한 이름이 커널 객체에 사용되고 있다면 객체의 공유가 불가능하기에 NULL 값 반환 됨.

🔸Return

  • 성공 시, 생성된 이벤트 객체의 핸들이 반환.
    • 동일한 이름으로 생성된 이벤트 객체가 이미 생성되어 있다면 해당 객체의 핸들이 반환될 것이며, ERROR_ALREADY_EXISTS 반환 됨.
  • 실패 시, NULL 값 반환
    • 자세한 오류 원인은 GetLastError

🔸이벤트 객체의 사용 끝난 후, CloseHandle(h_event_object) 로 제거해줘야 함.

🔶SetEvent 함수, ResetEvent 함수

  • SetEvent(HANDLE hEvent) : 이벤트 객체의 상태 값 TRUE로 설정
  • ResetEvent(HANDLE hEvent) : 이벤트 객체의 상태 값 FALSE로 설정
// 수동 해제, 초깃값 FALSE
HANDLE h_event_object = CreateEvent(NULL, TRUE, FALSE, NULL);

// h_event_object 객체의 상태값 TRUE 상태로 변경
SetEvent(h_event_object);

// h_event_object 객체의 사용 중단
CloseHandle(h_event_object);

🔶WaitForSingleObject 함수

여기 참고


🙆‍♀️참고🙆‍♂️

CreateEvent()

0개의 댓글