프로세스를 실행시키는 방법은 아래와 같다
1. 바탕화면에 있는 아이콘을 실행
2. 프로그래밍을 통해 프로세스 실행(부모-자식 프로세스)
위의 2가지는 사실 똑같은 방법이다.
- 바탕화면도 프로세스이다.
- 더블클릭 이벤트가 발생하면 바탕화면(부모) 프로세스가 클릭된 프로세스(자식)을 실행시킨다.
프로세스 생성 함수
BOOL CreateProcess(
LPCTSTR lpApplicationName,
LPTSTR lpCommandLine,
LPSECURITY_ATTRIBUTES lpProcessAttributes,
LPSECURITY_ATTRIBUTES lpThreadAttributes,
BOOL bInheritHandles,
DWORD dwCreationFlags,
LPVOID lpEnviroment,
LPCTSTR lpCurrentDirectory,
LPSTARTUPINFO lpStartupInfo,
LPPROCESS_INFORMATION lpProcessInformation
);
첫 2가지와 마지막 2가지가 중요하다.
- LPCTSTR lpApplicationName : 실행 파일 이름
- LPTSTR lpCommandLine : 매개변수 (실행 파일 이름까지도 여기에 표현가능)
- LPSTARTUPINFO lpStartupInfo : 생성하려는 프로세스의 정보(전달 목적)
- LPPROCESS_INFORMATION lpProcessInformation : 생성된 프로세스의 정보(제공받기 위한 목적)
LPSTARTUPINFO 구조체
typedef struct _STARTUPINFO {
DWORD cb; // 구조체 변수의 크기
LPTSTR lpReserved;
LPTSTR lpDesttop;
LPTSTR lpTitle; // 콘솔 윈도우의 타이틀 바 제목
DWORD dwX; // 프로세스 윈도우의 x 좌표
DWORD dwY; // 프로세스 윈도우의 y 좌표
DWORD dwXSize; // 프로세스 윈도우의 가로 길이
DWORD dwYSize; // 프로세스 윈도우의 세로 길이
DWORD dwXCountChars;
DWORD dwYCountChars;
DWORD dwFillAttribute;
DWORD dwFillAttribute;
DWORD dwFlags; // 설정된 멤버의 정보
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
HANDLE hStdOutput;
HANDLE hStdError;
} STARTUPINFO, *LPSTARTUPINFO;
cb로 구조체의 크기를 전달하는 이유
- CreateProcess 함수의 9번째 전달인자가 다른것도 올 수 있게 하도록 라이브러리를 개편하는 경우 구별하기 위해서 전달한다.
LPPROCESS_INFORMATION 구조체는 지금 알필요 없다.
typedef struct _PROCESS_INFORMATION
{
HANDLE hProcess; //프로세스의 핸들
HANDLE hThread; // 쓰레드 핸들
DWORD dwProcessId; //프로세스 ID
DWORD dwThreadId; //쓰레드 ID
}PROCESS_INFOMATION
표준 검색경로
- 파일을 오픈할때 경로를 명시해주지 않으면 다음과 같은 순서로 실행파일을 찾는다.
1. 실행중인 프로세스의 실행파일이 존재하는 디렉터리
2. 실행중인 프로세스의 현재 디렉터리(Current Directory)
3. Windows의 시스템 디렉터리(System Directoy)
4. Windows의 디렉터리(Windows Directory)
5. 환경변수 PATH에 의해 지정되어 있는 디렉터리
'뇌를 자극하는 윈도우즈 시스템 프로그래밍 > 개념' 카테고리의 다른 글
프로세스 간 통신(IPC)와 Signaled, Non-Signaled 상태 (0) | 2019.05.08 |
---|---|
커널 오브젝트와 오브젝트 핸들 (0) | 2019.04.03 |
프로세스와 스케줄러의 이해 (0) | 2019.03.18 |
Direct 모드와 Indirect 모드 (0) | 2019.03.18 |
프로그램 구현 관점에서의 WIN32 vs WIN64 // 오류의 확인 GetLastError 함수 (0) | 2019.03.18 |