C++에서 실행 파일 실행을 위한 ::CreateProcess의 효율적인 호출 방법

C++로 애플리케이션을 개발할 때, 때때로 코드에서 외부 실행 프로그램을 실행해야 할 필요가 생길 수 있습니다. 이 작업은 애플리케이션이 프로세스가 완료될 때까지 기다리고 시스템 리소스를 적절히 관리해야 한다는 점에서 처음에는 다소 어렵게 느껴질 수 있습니다. 이 블로그 포스트에서는 Windows API의 ::CreateProcess 함수를 효과적으로 사용하는 방법을 살펴보겠습니다. 이를 통해 Windows 애플리케이션을 실행하고, 실행을 처리하며, 리소스를 정리하는 방법을 알아볼 것입니다.

문제 이해하기

다음과 같은 요구 사항이 있을 수 있습니다:

  1. C++ 애플리케이션 내에서 실행 파일(.exe 파일)을 실행해야 합니다.
  2. 실행 파일이 실행을 마칠 때까지 기다립니다.
  3. 리소스 누수를 방지하기 위해 프로세스와 관련된 모든 핸들을 올바르게 닫아야 합니다.

실행 파일 실행을 위한 ::CreateProcess 사용하기

CreateProcess 함수는 Windows에서 다른 애플리케이션을 시작하는 강력한 방법입니다. 이 함수는 실행 파일을 실행하는 방식을 제어하기 위해 다양한 매개변수를 지정할 수 있도록 허용합니다. 아래에서는 C++ 프로그램 내에서 이를 구현하기 위한 필요한 단계를 정리하겠습니다.

단계별 구현

  1. STARTUPINFO 구조체 정의하기: 이 구조체는 새 프로세스를 시작하는 방법에 대한 정보를 포함합니다(예: 창의 모양).

    STARTUPINFO info = { sizeof(info) };  
    
  2. PROCESS_INFORMATION 구조체 정의하기: 이 구조체는 새로 생성된 프로세스와 그 주요 스레드에 대한 정보를 수신합니다.

    PROCESS_INFORMATION processInfo;  
    
  3. CreateProcess 함수 호출하기: 이 함수는 실행 파일의 경로, 명령줄 인수, 보안 속성 등을 지정하는 매개변수를 사용합니다.

    if (CreateProcess(path, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo)) {
        ...
    }
    

전체 코드 예제

아래는 모든 요소를 통합한 전체 예제입니다:

#include <windows.h>

void LaunchExecutable(const char* path, const char* cmd) {
    STARTUPINFO info = { sizeof(info) };  
    PROCESS_INFORMATION processInfo;

    if (CreateProcess(path, cmd, NULL, NULL, TRUE, 0, NULL, NULL, &info, &processInfo)) {
        // 프로세스가 완료될 때까지 대기합니다
        WaitForSingleObject(processInfo.hProcess, INFINITE);
        // 프로세스 및 스레드 핸들을 닫습니다
        CloseHandle(processInfo.hProcess);
        CloseHandle(processInfo.hThread);
    } else {
        // 오류 처리 (필요한 경우)
    }
}

주요 구성 요소 설명

  • CreateProcess의 매개변수:

    • path: 실행할 실행 파일의 경로입니다.
    • cmd: 실행 파일에 전달된 명령줄 인수(사용하지 않는 경우 NULL일 수 있습니다).
    • NULL, NULL: 프로세스와 그의 주요 스레드에 대한 기본 보안 속성입니다.
    • TRUE: IPC 또는 기타 용도를 위한 프로세스와 스레드에 대한 핸들입니다.
    • 0: 생성 플래그(0은 기본 동작을 나타냅니다).
  • 프로세스 완료 대기:

    • WaitForSingleObject(processInfo.hProcess, INFINITE): 이 함수는 지정된 프로세스가 끝날 때까지 실행을 차단합니다.
  • 정리:

    • 항상 CloseHandle을 사용하여 핸들을 닫아 메모리 누수 및 기타 잠재적인 문제를 방지해야 합니다.

결론

C++ 애플리케이션에서 ::CreateProcess를 사용하여 Windows 실행 파일을 실행하는 것은 위의 절차를 따르면 간단합니다. 실행 파일이 완료되기를 기다리고 핸들을 정리하는 것은 리소스 관리를 위해 매우 중요합니다. 이러한 단계를 따르면 외부 애플리케이션을 C++ 작업 흐름에 원활하게 통합할 수 있습니다.

추가 질문이 있거나 WinAPI 사용에 대한 더 많은 예제가 필요하시면 언제든지 문의해 주세요!