CreateProcess 함수는 프로세스를 생성한 후 곧바로 리턴.
- FindWindow로 윈도우 핸들을 찾지 못함.
DWORD WINAPI WaitForInputIdle(__in HANDLE hProcess, __in DWORD dwMilliseconds);
참고주소 : http://msdn.microsoft.com/en-us/library/ms687022.aspx
초기화가 완료될 때까지(사용자의 입력을 대기할 수 있을 때까지) 기다림.
리턴 : 성공시 0, timeout이 지나갔을 경우 WAIT_TIMEOUT, 실패시 WAIT_FAILED
hProcess : 프로세스 핸들. 콘솔 프로그램이나 메세지 큐가 없으면 곧바로 리턴.
dwMilliseconds : 밀리초 단위의 timeout간격. INFINITE면 프로세스가 idle할 때까지 기다림.
명령행 인수
1. lpszCmdParam(WinMain만 가능) : 프로그램 명은 제외하고 명령행 인수 전체가 통째로 하나의 문자열로 전달.(WinMain)
2. __argc, __argv 전역변수 : 도스에서와 의미 동일, __argc는 전달인수 개수. __argv는 인수 문자열 배열 포인터
3. LPTSTR GetCommandLine();와 LPWSTR *CommandLineToArgvW(LPCWSTR, int*);
LPTSTR WINAPI GetCommandLine(void);
참고주소 : http://msdn.microsoft.com/en-us/library/ms683156(VS.85).aspx
리턴 : 현재 프로세스의 명령행 줄 문자열의 포인터.
명령행 인수 전체 문자열을 전달. 유니코드 명령행 인수도 읽을 수 있다.
LPWSTR *CommandLineToArgvW(__in LPCWSTR lpCmdLine,__out int *pNumArgs);
참고주소 : http://msdn.microsoft.com/en-us/library/bb776391(VS.85).aspx
명령행 인수들을 각 토큰 단위로 나눈다. 유니코드형 변수로 읽고 리턴한다.
리턴 : argv와 비슷한 LPWSTR의 포인터 배열
lpCmdLine : 0으로 끝나며 모든 명령 줄을 포함하는 유니코드 문자열의 포인터.
pNumArgs : argc와 비슷하게 배열 개수를 리턴.
프로세스 종료
VOID ExitProcess(UINT uExitCode);
1. DLL정리 - 각 DLL의 dllMain함수가 호출되어 스스로 정리작업을 한다.
2. 모든 열려진 핸들을 닫는다.
3. 실행중인 모든 쓰레드를 종료.
4. 이 객체를 기다리는 다른 프로세스는 대기 상태를 해제할 수 있다.
5. 종료코드는 STILL_ACTIVE에서 nExitCode값이 된다.
BOOL WINAPI TerminateProcess(__in HANDLE hProcess, __in UINT uExitCode);
참고주소 : http://msdn.microsoft.com/en-us/library/ms686714(VS.85).aspx
특정 프로세스와 그 쓰레드들을 모두 종료한다.
리턴 : 성공시 TRUE, 실패시 FALSE
hProcess : 종료시킬 프로세스의 핸들, 핸들은 PROCESS_TERMINATE 접근 정보를 가져야 함.
uExitCode : 이 호출의 결과로서 종료된 프로세스나 쓰레드에 의해 사용될 종료 코드
프로세스 핸들
USER 객체 : 윈도우 관리에 사용. 시스템 전역적.
GDI 객체 : 그래픽을 위해 사용. 해당 객체는 만든 프로세스 내에서만 사용 가능.
커널 객체 : 메모리 프로세스 IPC 동기화 등에 사용되는 객체. 프로세스(시스템) 한정적.
프로세스 한정적 : 한 프로세스가 만든 핸들은 다른 프로세스에서 곧바로 사용할 수 없되 대신 다른 프로세스가 같은 객체를 다시 open하여 또 다른 핸들을 사용가능.
HANDLE WINAPI OpenProcess(__in DWORD dwDesiredAccess, __in BOOL bInheritHandle, __in DWORD dwProcessId);
참고주소 : http://msdn.microsoft.com/en-us/library/ms684320(VS.85).aspx
현재 있는 프로세스를 연다.
리턴 : 성공시 열려 있는 프로세스의 핸들을 리턴 실패시 NULL을 리턴.
dwDesiredAccess : 프로세스에 대한 접근 권한. 프로세스의 security descriptor에 의해 검사된다.
bInheritHandle : TRUE면 핸들은 이 프로세스에 의해 만들어진 프로세스들은 핸들을 상속할 것이다. FALSE면 상속하지 않을 것이다.
dwProcessID : 열리게 될 프로세스의 ID. 0x00000000이면 시스템 프로세스기 때문에 오류 발생.
BOOL WINAPI GetExitCodeProcess(__in HANDLE hProcess, __out LPDWORD lpExitCode);
참고주소 : http://msdn.microsoft.com/en-us/library/ms683189(VS.85).aspx
특정 프로세스의 종료 상태를 얻는다.
리턴 : 성공시 TRUE, 실패시 FALSE
hProcess : 프로세스의 핸들. 핸들은 PROCESS_QUERY_INFORMATION 계열의 접근 권한이 있어야 된다.
lpExitCode : 프로세스 종료 상태를 받을 변수 포인터.(ExitProcess, TerminateProcess, main, Winmain, 프로세스 종료를 야기한 처리되지 않는 예외값.)
쓰레드 방식으로 변경
OS scheduler가 쓰레드를 책임진다.
쓰레드 라이브러리를 사용하는 이유 : 쓰레드에 안전한 함수들을 여러 쓰레드에서 사용할 수 있게 해 준다.
HANDLE WINAPI CreateThread(__in_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, __in SIZE_T dwStackSize, __in LPTHREAD_START_ROUTINE lpStartAddress, __in_opt LPVOID lpParameter, __in DWORD dwCreationFlags,
__out_opt LPDWORD lpThreadId);
참고주소 : http://msdn.microsoft.com/en-us/library/ms682453.aspx
호출한 프로세스의 가상 주소 공간에서 실행할 쓰레드를 생성한다.
다른 프로세스의 가상 주소 공간에서 실행될 쓰레드를 만들려면 CreateRemoteThread 함수를 사용하라.
리턴 : 성공시 새 쓰레드에 대한 핸들. 실패시 NULL
lpThreadAttributes : 돌아온 핸들값이 자식 프로세스에 의해 상속될 수 있는 지 결정하는 구조체 포인터. NULL이면 상속되지 않는다.
dwStackSize : 바이트 단위로 스택의 초기화 크기. 0이면 기본 크기를 사용하는 쓰레드 생성.
lpStartAddress : 쓰레드에 의해 실행될 응용프로그램에서 정의된 함수포인터.
lpParameter : 쓰레드에 넣은 변수 포인터
dwCreationFlags : 쓰레드 생성을 제어할 플래그. CREATE_SUSPENDED : 잠시멈춘 상태로 쓰레드 생성
lpThreadId : 쓰레드 ID를 받을 변수 포인터. NULL이면 받지 않음.
BOOL WINAPI GetExitCodeThread(__in HANDLE hThread, __out LPDWORD lpExitCode);
참고주소 : http://msdn.microsoft.com/en-us/library/ms683190.aspx
특정 쓰레드의 종료 상태를 얻는다.
리턴 : 성공시 TRUE, 실패시 FALSE
hThread : 쓰레드 핸들. 핸들은 THREAD_QUERY_INFORMATION 관련 접근 권한을 가져야 한다.
lpExitCode : 쓰레드 종료 상태을 얻을 변수 포인터. 바로 상태를 리턴한다.
- 쓰레드가 작동 중이고 함수호출 성공시 : STILL_ALIVE
- 쓰레드가 종료되었고 함수 호출시 : ExitThread, TerminatedThread함수의 종료 값, 쓰레드 함수의 리턴값. 쓰레드 프로세스의 종료값
VOID WINAPI ExitThread(__in DWORD dwExitCode);
참고주소 : http://msdn.microsoft.com/en-us/library/ms682659.aspx
호출한 쓰레드를 종료한다. (응용 프로그램에서 정의된 함수에서 사용.)
dwExitCode : 쓰레드를 위한 종료 코드
BOOL WINAPI TerminateThread(__inout HANDLE hThread, __in DWORD dwExitCode);
참고주소 : http://msdn.microsoft.com/en-us/library/ms686717(VS.85).aspx
쓰레드를 종료시킨다.
리턴 : 성공시 TRUE, 실패시 FALSE
hThread : 종료될 쓰레드의 핸들. 핸들은 THREAD_TERMINATE 접근 권한이 있어야 한다.
dwExitCode : 쓰레드에 대한 종료코드
DWORD WINAPI SuspendThread(__in HANDLE hThread);
참고주소 : http://msdn.microsoft.com/en-us/library/ms686345(VS.85).aspx
특정 쓰레드를 일시정지 시킨다.
리턴 : 성공시 쓰레드의 이전 일시정지된 카운트값. 실패시 -1.
hThread : 일시정지될 쓰레드 핸들
DWORD WINAPI ResumeThread(__in HANDLE hThread);
참고주소 : http://msdn.microsoft.com/en-us/library/ms685086(VS.85).aspx
쓰레드의 일시정지 카운트 값을 감소한다. 이 일시정지 값이 0이되면 쓰레드의 실행이 재개될 것이다.
리턴 : 성공시 쓰레드의 이전 일시정지된 카운트값. 실패시 -1
hThread : 다시 시작할 쓰레드의 핸들.
우선순위
우선 순위 클래스 : 쓰레드를 소유한 프로세스의 우선순위
우선 순위 레벨 : 프로세스 내에서 쓰레드의 우선 순위
동적우선순위 : 우선 순위가 결정되어도 실제 적용되는 우선순위는 시스템에 의해 변함.
BOOL WINAPI SetThreadPriority(__in HANDLE hThread, __in int nPriority);
참고주소 : http://msdn.microsoft.com/en-us/library/ms686277(VS.85).aspx
특정 쓰레드에 대한 우선순위 값을 설정한다. 이 값은 우선순위 클래스와 결합하여 쓰레드의 기본 우선순위를 결정하게 된다.
리턴 : 성공시 TRUE, 실패시 FALSE
hThread : 우선순위 값을 설정하게 될 쓰레드의 핸들. 핸들은 THREAD_SET_INFORMATION 계열의 권한을 가지고 있어야 한다.
nPriority : 쓰레드에 대한 우선순위 값.
int WINAPI GetThreadPriority(__in HANDLE hThread);
참고주소 : http://msdn.microsoft.com/en-us/library/ms683235.aspx
특정 쓰레드에 대한 우선순위 값을 얻는다.
리턴 : 성공시 쓰레드 우선순위 값을 얻는다. 실패시 THREAD_PRIORITY_ERROR_RETURN
hThread : 쓰레드의 핸들. THREAD_QUERY_INFORMATION 계열의 권한을 가지고 있어야 한다.
'컴퓨터 공부 > Win32 API 프로그래밍' 카테고리의 다른 글
[5월 11일 3교시] 동기화 2 (0) | 2009.05.11 |
---|---|
[5월 11일 2교시] 동기화 1 (0) | 2009.05.11 |
[5월 8일 3교시] 메모리 2 + 멀티 쓰레드 1 (0) | 2009.05.08 |
[5월 8일 2교시] 메모리 1 (0) | 2009.05.08 |
[5월 8일 1교시] 시스템 정보 2 (0) | 2009.05.08 |