말 그대로다.
MFC에서 외부 실행 프로그램의 결과값이 필요없다면야 system() 등등의 함수로도 충분할테지.
하지만 리턴값이 필요하거나, console base program 을 실행하고, 그 결과를 받아서 ( = 잘 실행되었는지, 혹은 결과값 조작 등등 ) 연계작업을 해야 한다면 어떨까?
[ 왜 갑자기 이 짤방이 생각난건지... ]
이때, 테스트 코드 만들고 잘 되는지 확인하기 위해 , 외부 프로그램을 하나 실행시켜서 테스트 해 봐야 하지 않겠는가?
당신은 무엇으로 테스트 해 볼 거인가?
리턴값을 받아봐야 하니까 mspaint, notepad, calc 등은 못쓴다.
그렇다고 리턴값 토해내는 걸 따로 만들기는 귀찮고.
dos command 인 "dir" 정도가 가장 만만하지 않을까?
단적으로 말하면, console application 과 dos command 는 다르다. 별개의 영역이고, CreateProcess() 함수는 console application 을 실행하는 함수이지 dos command 를 실행하는 함수가 아니다.
그러므로, 만일 당신이
CreateProcess( NULL, "dir", NULL, ... )
과 같이 CreateProcess() 함수를 실행했다면, 이건 에러난다.
이때의 에러코드는 GetLastErr() 로 얻을 수 있는데, 에러코드 2번 : "0x0002 지정한 파일을 찾을 수 없습니다." 를 반환한다.
무슨 소리냐면, "dir" 따위는 Windows 의 Application 에 등록되어 있지 않다는 뜻이다.
CreateProcess()의 처음 인자값은 "실행할 어플리케이션 이름" 이고, 두번째는 "어플리케이션 에 할당할 argument값 " 이므로, 첫번째 인자를 cmd, 두번째 인자를 dir 로 주자.
근데 이것도 그냥 주면 안됨.
실제로 dos command 실행을 위해서는 "cmd \c dir" 의 형태로 실행해 주어야 한다.
그러므로, 결론은
CreateProcess( "C:\\Windows\\System32\\cmd.exe", "\c dir", NULL, ... )
되시겠다.
실행해 보면 잘 나온다.
'프로그램' 카테고리의 다른 글
node.js - cannot find module 'routes' 오류. (0) | 2015.10.24 |
---|---|
MFC 에서 Thread 사용 양식 - 가장 간단한 예제. (0) | 2015.08.27 |
C# 의 Socket 객체에는 close() 말고도 disconnect(), shutdown() 이 있다. (0) | 2015.07.22 |
MFC 에서 CreateProcess() 가 Access Violation 을 일으킬때 (0) | 2015.07.15 |
님들 그거 앎? GDI+ 로 JPEG 압축률 지정 가능. (0) | 2015.06.29 |