본문 바로가기

공부/프로그래밍

[WIN32]내가 만든 프로그램이 다른 프로그램을 실행시킨다??

음,,,
윈도우를 공부하면서 원격 데스크탑 같은 기능은 어떻게 구현하는 걸까??라는 생각을 자주 하게 된다..

뭐 아직 모르는게 많다 보니 원격 데스크탑 까지는 아니지만,,
내가 만든 프로그램이 다른 프로그램을 실행시키는 방법은 알게 되었다..
원격 데스크탑이 원격 PC의 화면을 내 PC의 화면에 뿌려주는 에뮬레이터라고 한다면,,
원격 데스크탑으로 원격 PC의 특정 프로그램을 실행시키는 것과도 비슷하지 않을까??하는 생각이 든다..

비슷한 맥락에서,,
우리가 당연한듯이 사용하는 바탕화면도 explorer.exe라는 프로그램이라는 걸 감안한다면,,
바탕화면에 떠있는 아이콘을 더블클릭해서 특정 프로그램을 실행시키는 것 또한,,
내가 만든 프로그램이 다른 프로그램을 실행시킨다..는 것과 같은 원리이다..

그럼 이런 것을 가능하게 해주는 함수는 무엇인가??
바로 CreateProcess()라는 함수이다..
이름에서 알 수 있듯이 인자로 넘어온 이름의 프로그램을 실행시켜 새로운 프로세스를 생성하는 함수이다.. 자세한 설명은 MSDN을 참조하자..

CreateProcess()는 10개의 파라미터를 가진다..
이 중에 9,10 번째 파라미터는 STARTUPINFO,PROCESS_INFORMATION 구조체의 값을 넘겨줘야 한다.. 따라서 함수를 호출하기 전에 두 구조체 타입의 변수를 먼저 만들어 둬야 한다..
PROCESS_INFORMATION 구조체의 변수는 CreateProcess() 함수 호출시 인자로 넘겨주면 윈도우가 알아서 값을 채워주기 때문에 특별히 처리할 건 없다.. 하지만 STARTUPINFO 구조체의 변수는 생성시 반드시 0으로 초기화 해둬야 한다.. (={0,}을 쓰면 아주 편하다..ㅋ) 그리고 특별한 일이 없으면 특정한 값을 넣을 필요는 없지만 cb 멤버는 반드시 sizeof(si) 등으로 값을 넣어 줘야 한다..

CreateProcess()는 1,2 번째 파라미터로 실행파일의 이름과 명령행 인수를 전달 받는다.. 하지만 보통 1 번째 파라미터는 NULL을 주고 2 번째 파라미터 값에 [실행파일 이름 + 명령행 인수]로 많이 쓴다고 한다..
또 하나 중요한건 이 2 번째 파라미터의 타입이 문자열 포인터라는 것.. 따라서 "_T("실행파일 이름 + 명령행 인수")"와 같은 식으로 2 번째 파라미터의 값을 주면 에러가 난다..
반드시 배열에 미리 문자열을 저장하고 그 포인터를 넘겨 줘야 함수가 제대로 동작한다는 걸 잊지 마라..

그 외의 나머지 파라미터는 5 번째를 제외하고는 다 NULL 값을 주면 된다..
5 번째 파라미터는 프로세스의 핸들과 관련이 있는데 아직 제대로 이해를 못했다..

지금까지의 내용을 정리해 보자..
내가 만든 프로그램에서 다른 프로그램을 실행시키고 싶은가??
CreateProcess()를 사용하자..
이 함수를 사용할 땐 2,5,9,10 번째 파라미터에 주의를 요한다.. 아울러 STARTUPINFO, PROCESS_INFORMATION 구조체 타입의 변수도 미리 만들어 놔야 한다는 걸 잊지 말자..

마지막으로,,
CreateProcess()는 BOOL 타입의 값을 반환한다..
성공하면 nonzero를 반환하고 실패하면 당연히 0을 반환한다.. 따라서 함수 호출의 성공 여부를 두고 예외처리도 적절히 구현하는걸 잊지 말자..
아울러 CreateProcess()를 호출했으면 CloseHandle()를 호출해서 프로그램이 해당 커널 오브젝트에 관련된 핸들을 더 이상 참조하지 않는다는 것을 윈도우에게 알리는 것도 잊지 말자..

아직 가야할 길이 멀다.. 꾸준히 정진하자..