'ShellExecuteEx()'에 해당되는 글 1건
- 2009.03.31 copy는 실행파일이 아니다(!?)
copy는 실행파일이 아니다(!?)

최근에 한 삽질중의 하나..
파일 Sync를 마추기 위한 툴을 만들고 있는 중.. 툴 내부에서 도스 명령어 copy를 실행할 필요가 있어서,
ShellExcuteEx()를 사용해서 아래와 같이 코드를 작성했다.
SHELLEXECUTEINFO si;
ZeroMemory(&si, sizeof(si));
si.cbSize = sizeof(SHELLEXECUTEINFO);
si.lpFile = _T("copy");
si.lpParameters = _T("c:\temp\*.* d:\temp");
si.lpVerb = _T("open");
si.nShow = SW_SHOW;
ShellExecuteEx(&si);
(생각나는대로 작성했으니, 코드가 컴파일 된다는 보장은 없지만, 의미상 이해는 되리라 생각한다.)
그리고 테스트를 해 보니, 실행이 안된다. 다른 실행파일들은 잘 만 실행되는데, copy만 유독 안된다.
한참 괴로워 하는 중.. 생각난것이 도스 시절 copy는 외부 명령어가 아니고, 내부명령어였던 것이다.
copy로 파일 검색을 해 보니, 역시나 copy.com 이나 copy.exe라는 파일은 없다...
흠 그렇군.. 그럼 윈도우즈에서는 cmd가 도스창이니, cmd를 이용하면 되겠구나 라는 생각에 약간의 삽질 후 아래와 같이 코드를 수정했다.
SHELLEXECUTEINFO si;
ZeroMemory(&si, sizeof(si));
si.cbSize = sizeof(SHELLEXECUTEINFO);
si.lpFile = _T("cmd");
si.lpParameters = _T("/C copy c:\temp\*.* d:\temp");
si.lpVerb = _T("open");
si.nShow = SW_SHOW;
ShellExecuteEx(&si);
잘된다.
당연한건데, 나만 몰랐던건가? 라는 자괴감이 든다... -_-
지나고 나서야 생각나는 건데 이 부분은 CI설정했을때도 비슷한 구문을 많이 접했었던건데..
** 참고로 /C 옵션을 주지 않고 실행하면 해당 명령을 실행한후 커맨드 창이 남아 있다. /C를 주어야 해당 명령 완료후 창이 종료 된다.