한 프로그램에서 다른 프로그램을 실행할 때 WinAPI의 프로세스 생성 함수 사용
프로세스를 생성하는 가장 쉽고도 간단한 함수
UINT WinExec( LPCTSTR lpCmdLine, UINT uCmdShow );
lpCmdLine - 실행하고자 하는 프로그램의 이름
uCmdShow - 프로그램 실행 직 후 프로그램이 어떻게 보일지 결정
SW_SHOWNORMAL, SW_SHOWMAXIMIZED, SW_SHOWMINIMIZED, SW_SHOW, SW_HIDE 등
실행 파일만 주어졌을 때 다음 순서대로 실행 파일의 위치 검색하여 발견된 실행 파일을 실행
1. 프로그램이 실행된 디렉토리
2. 현재 디렉토리
3. 시스템 디렉토리
4. 윈도우즈 디렉토리
5. PATH 환경 변수가 지정하는 디렉토리들
이 검색 경로에 있는 실행 파일이면 드라이브, 디렉토리 이름을 생략하고 실행 파일 이름만 지정 가능
그렇지 않으면 실행파일이 있는 절대 경로를 조사해서 정확한 경로를 지정
프로그램 리턴 값
0 - 메모리나 리소스가 부족하여 프로세스 생성 못함
ERROR_BAD_FORMAT - 지정한 파일이 실행 파일이 아님
ERROR_FILE_NOT_FOUND - 파일이 없음
ERROR_PATH_NOT_FOUND - 경로가 없음
리턴값보다 중요한 것은 이 함수가 리턴하는 시기
프로세스 생성 과정
1. 주소 공간을 할당
2. 주 스레드 생성
3. 관련 DLL 을 모두 읽어오고 초기화
WinExec 는 생성된 프로세스가 처음으로 GetMessage( ) 함수를 호출할 때 리턴
즉 새 프로세스가 일련의 초기화 작업을 마무리 하고 스스로 메시지를 처리할 수 있을 때 비로소 리턴
WinExec 는 프로세스 완료 후에 리턴하기 때문에 에러가 없으면 바로
FindWindow( )로 생성된 프로세스의 메인 윈도우를 찾을 수도 있고 SendMessage( ) 로 메시지를 보낼 수도 있음
즉 프로세스 생성 직후 두 프로세스끼리 안전하고 완벽한 상호 작용 가능
CreateProcess( ) 는 그렇지 않음
프로세스를 생성하는 두 번째 함수
LoadModule(LPCTSTR lpModuleName, LPVOID lpParameterBlock);
댓글