프로그램

MFC 의 CreateProcess() 를 테스트 할 때, "dir" 등등의 dos command 로 테스트 하지 말아라.

(주)CKBcorp., 2015. 7. 23. 06:00
반응형


말 그대로다.

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, ... ) 


되시겠다.


실행해 보면 잘 나온다.



 


반응형