Windows 프로그래밍
-
Volatile 변수란?Windows 프로그래밍 2019. 1. 7. 16:35
이름부터 신기한 볼라틸 변수에 대해 알아보자. 결론부터 말하자면 볼라틸로 선언한 변수는 사용할 때 마다 메모리에 접근해 해당 변수의 값을 확인한다. 그럼 이제 이걸 왜 쓰는지 이유를 알아보도록 하자. 아래와 같은 코드가 있다. 쓰레드를 실행하는 함수 하나와 check값이 FALSE 이면 계에에에속 도는 while문이 Main에 있다. Main에서 실행한 쓰레드에서는 check 값을 TRUE로 바꿔준다. BOOL check = FALSE; int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE, LPSTR lpCmdLine, int nCmdShow){ DWORD dwThreadId; CreateThread(NULL, 0, ThreadFunc, NULL, 0, &dwThr..
-
Service 프로세스에서 winlogon.exeWindows 프로그래밍 2019. 1. 3. 17:39
Windows Service 프로그램을 개발하던 중 Winlogon.exe 프로세스의 세션 ID를 가져오는 것을 보았다.왜 하필이면 이 프로세스의 세션 ID를 가져오고, 이 프로세스가 무슨 일을 하는건지 궁금해서 찾아보게 되었다. 일반적으로 Service 프로그램들은 GUI를 다룰 수 없다. Windows가 보안성을 위해 시스템 프로세스와 사용자 영역을 분리해 두었는데, Service는 시스템 프로세스에 속하기 때문이다. 작업 관리자를 보면 사용자 이름이 컴퓨터 이름인 프로세스들의 세션 ID는 1로 표시되어 있고 SYSTEM이나 다른 몇몇 사용자 이름을 가진 프로세스들은 0번으로 표시되어 있다.즉, Service 프로세스라도 세션 번호가 1이라면 사용자 영역에 접근해 창을 띄울 수 있다는 뜻이다. 이제 ..
-
OnTimer 함수Windows 프로그래밍 2019. 1. 3. 11:16
목요일마다 주간보고서를 써야 하는데 까먹는 날이 종종 있었다. 그래서 매주 목요일마다 주간보고서 파일을 자동으로 생성해주는 서비스를 만들게 되었다. 이때 사용한 함수가 OnTimer 함수이다. 주기적으로 시간 체크를 해야 했기에 특정 시간마다 현재 시간을 체크해주는 함수가 필요했다.OnTimer는 그런 역할을 해주는 함수이다. 이제 사용법을 알아보자. Dialog 속성에서 메시지 탭을 보면 아래처럼 WM_TIMER가 있다. 여기서 OnTimer를 눌러 메시지를 추가한다.Message Map에 ON_WM_TIMER가 추가된 것을 볼 수 있다. BEGIN_MESSAGE_MAP(CMutexProjectDlg, CDialogEx) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_TIMER(..
-
Mutex와 Semaphore의 차이점과 사용방법Windows 프로그래밍 2019. 1. 3. 10:37
Mutex와 Semaphore 둘 다 동기화 커널 객체라는 공통점이 있다.동기화 커널 객체는 멀티 쓰레드 환경에서 공통된 자원에 다수의 쓰레드가 동시에 접근하게 되어 발생하는 문제를 예방하기 위해 사용하는 것이다. 약간 요론 느낌? 그래서! Mutex와 Semaphore의 차이점이 뭐냐, Mutex는 한 번에 하나의 쓰레드 만이 자원에 접근할 수 있고, Semaphore는 한 번에 접근할 수 있는 쓰레드의 갯수를 생성 시에 지정할 수 있다. 따라서 여러 쓰레드가 한 번에 자원에 접근하도록 하고 싶다면 Semaphore를 사용하고 그렇지 않은 경우에는 Mutex를 사용하면 될 것 같다. 그럼 이제 사용법을 알아보자. Mutex 먼저 뮤텍스의 생성 및 사용법을 보자.뮤텍스는 CreateMutex() 라는 함..
-
화면 캡쳐와 Printwindow 함수Windows 프로그래밍 2019. 1. 2. 17:16
현재 띄워져 있는 모든 창의 화면을 캡쳐해오고 싶었다. 많은 함수로 시도해 봤지만 내가 잘못한 건진 모르겠는데 잘 되지 않았다. 그 때 Printwindow라는 함수를 찾게 되었다.Printwindow는 캡쳐를 원하는 창의 핸들과 DC, 그리고 옵션 이렇게 3가지의 인수를 넘기면 해당 창을 캡쳐한 비트맵의 핸들을 반환한다. MSDN : https://docs.microsoft.com/en-us/windows/desktop/api/winuser/nf-winuser-printwindow 프로세스의 핸들 값만 넘기면 캡쳐본의 비트맵 핸들을 반환해 주는 함수를 만들어 보았다. HBITMAP Capture(HWND hTargetWnd) { HDC hDC = ::GetDC(hTargetWnd); HDC hdcBit..
-
뮤텍스란?Windows 프로그래밍 2019. 1. 2. 15:55
개발을 하다 보면 쓰레드를 여러 개 이용하게 될 때가 있다. 그런데 만약 다수의 쓰레드가 하나의 변수 또는 자원에 동시에 접근한다면? 우리가 원하는 결과값이 나오지 않을 수도 있다. 뮤텍스(Mutex) 는 이러한 상황을 만들지 않기 위해 사용하는 커널 객체 중 하나이다. 이와 같은 동기화 커널 객체에는 '세마포어' 라는 것도 존재한다. 뮤텍스를 사용하면 한 번에 하나의 쓰레드만 특정 자원에 접근해 연산하게 된다. 예를 들어 1번 쓰레드가 특정 변수에 접근해 연산을 수행중이라면 2번 쓰레드는 1번 쓰레드의 연산이 끝날때까지 해당 변수에 접근할 수 없다. 실제 뮤텍스 사용 전후의 차이를 보고 싶어서 MFC를 이용해 한쪽은 뮤텍스를 사용하고 한쪽은 사용하지 않은 프로그램을 만들어 보았다. (실행파일은 첨부해 ..