# 개요

윈도우 프로그래밍을 하다 보면, 배치 파일이나 콘솔 기반의 프로그램을 자식 프로세스로 실행 할 때, 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