# 개요
윈도우 프로그래밍을 하다 보면, 배치 파일이나 콘솔 기반의 프로그램을 자식 프로세스로 실행 할 때, cmd창이 뜨는 것을 볼 수 있습니다. 특히 윈도우 서비스 프로그램은 백그라운드에서 동작하기 때문에 뭔가를 실행할 때 창이 뜨기를 원하지 않는 경우가 있습니다.
아래의 코드는 윈도우 서비스 및 윈도우 프로그래밍 중에서 별도의 창이 뜨지 않고 실행될 수 있도록 하는 코드 입니다.
# 코드
STARTUPINFO si;
PROCESS_INFORMATION pi;
TCHAR cmd[] = _T("C:\\test\\bat.cmd");
ZeroMemory(&si, sizeof(STARTUPINFO));
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
si.cb = sizeof(STARTUPINFO);
si.cb = sizeof(si);
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
// Start the child process.
if (!CreateProcess(NULL, // No module name (use command line)
cmd, // Command line
NULL, // Process handle not inheritable
NULL, // Thread handle not inheritable
FALSE, // Set handle inheritance to FALSE
0, // No creation flags
NULL, // Use parent's environment block
NULL, // Use parent's starting directory
&si, // Pointer to STARTUPINFO structure
&pi) // Pointer to PROCESS_INFORMATION structure
)
{
printf("CreateProcess failed (%d).\n", GetLastError());
return false;
}
// Wait until child process exits.
WaitForSingleObject(pi.hProcess, INFINITE);
// Close process and thread handles.
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
# 코드 설명
위의 코드에서 가장 주목하는 하는 코드는 아래와 같습니다.
si.dwFlags = STARTF_USESHOWWINDOW;
si.wShowWindow = SW_HIDE;
STARTUPINFO 구조체의 dwFlags와 wShowWindow가 반드시 위의 코드와 같이 함께 추가되어야 한다는 점입니다.
만약 자식 프로세스의 창을 숨겨야 하는데, 계속 뜬다면 dwFlags 값이 STARTF_USESHOWWINDOW로 설정되어 있는지 꼭 확인을 해봐야 합니다.
Leave a comment