김성엽님의 블로그를 따라하고 있습니다.
Win32 API 응용프로그래밍 을 Windows 데스크톱 응용프로그래밍이라고 한다.
응용프로그램은 어떻게 만들까?
초보개발자에서 벗어나기
운영체제와 리소스
응용프로그램은 컴퓨터 리소스에 접근을 해서 해당 작업을수행하게 된다.
응용프르로그램이 리소스에 직접 접근하면 위험하다.
핸들
: OS 에서 리소스를 안전히 관리하기위해 사용하는 주소
Win32 프로그램에서 핸들 값은 어떻게 저장할까?
HANDLE
자료형으로 저장 : unsigned int(32비트) 자료형 이다.HCURSOR h_my_cursor = LoadeCursor(NULL, IDC_ARROW); // 커서 핸들 값 저장
HINCON h_my_icon = LoadIcon(NULL, IDI_APPLICATION); // 아이콘의 핸들 값 저장
H(Handle) + Instance
Instance Handle 을 저장할 때 사용.
Process ID 와 다른 값이다.
Incetance Handle 값은 어떻게 얻누?
int WINAPI_WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdlLine, int nCmdShow)
{
...
hInstance 값을 잘 저장했다가 HINSTANCE형식의 값을 요구하는 API에 사용하면 됨.
HCURSOR LoadCursor(HINSTANCE hInstance, LPCWSTR lpCursorName);
서로 다른 스레드간 정보를 주고받거나 동기화할 때 사용하는 객체.
동기화(Synchorization)
Event 객체에 대하여
CreateEvent : 이벤트객체를 만드는 함수
Handle h_event_object = CreateEvent(NULL, TRUE, FALSE, NULL);
CreateEvent 함수는 아래와 같은 함수원형을 가지고 있음
HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL bManualReset, BOOl bInitialState, LPCSTR lpName);
NULL
쓰세용TRUE
라고 적으면 해당 객체가 조건에맞춰 FALSE 일때 까지 계속 TRUE.FALSE
라고 적으면 해당 객체가 조건에맞춰 TRUE 일때 까지 계속 TRUE.Handle h_event_object = CreateEvent(NULL, TRUE, FALSE, L"Tipsware");
ERROR_ALREADY_EXISTS
가 반환됨GetLastError
로 확인해보자.이벤트객체 사용이 끝나면 꼭 제거해야함
CloaseHandle(h_event_object);
이벤트 객체 상태 설정하기
TRUE
로 만들고 싶으면 SetEvent()
FALSE
로 만들고싶으면 ResetEvent()
// 이름없는 이벤트 객체를 생성(수동해제, 초기값 FALSE)
HANDLE h_event_object = CreateEvent(NULL, TRUE, FALSE, NULL);
SetEvent(h_event_object); // 이 이벤트 객체의 상태값을 TRUE 상태로 변경한다.
CloseHandle(h_event_object); // 이벤트 객체의 사용을 중단
이벤트 객체의 상태 체크하기
WaitForSingleObject()
: 이벤트 객체의 상태값이 변경되는지 체크할 때 사용되는 함수DWORD state = WaitForSingleObject(h_event_object, 5000); // 5000->5초
// 이벤트 객체 생성 (수동해제, 초기값 FALSE)
HANDLE h_event_object = CreateEvent(NULL, TRUE, FALSE, L"Tipsaware");
DWORD state = WaitForSingleObject(h_event_object,5000);
if(WAIT_OBJECT_0 == state){
// 5초 이내 상태가 변경된 경우
} else if(WAIT_TIMEOUT == state){
// 5초 동안 상태가 변경되지 않아서 타임아웃이 발생함
}
CloseHandle(h_event_object); // 이벤트 객체의 사용을 중단.
DWORD state = WaitorSingleObjcet(h_event_object,INFINITE);