ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 🖥️ C++에서 윈도우 프로그램 동시 실행 방지하기
    프로그래밍/C/C++ 2023. 2. 28. 13:25

    C++에서 윈도우 프로그램을 개발할 때 중복 실행을 방지하는 방법 중 가장 간단한 방법은 CreateMutex 함수를 사용하는 것입니다.

    #include <windows.h>
    
    int main()
    {
        HANDLE hMutex;
        hMutex = CreateMutex(NULL, TRUE, "MyMutex");
    
        if(GetLastError() == ERROR_ALREADY_EXISTS)
        {
            MessageBox(NULL, "이미 실행 중입니다.", "알림", MB_OK);
            return 0;
        }
    
        // 중복 실행이 아닐 때 실행할 코드 작성
        ...
    
        ReleaseMutex(hMutex);
        CloseHandle(hMutex);
    
        return 0;
    }
    
    

    위 코드에서 CreateMutex 함수를 이용하여 뮤텍스 객체를 생성합니다. 이 때, 뮤텍스 이름은 중복 실행을 방지하기 위해 고유한 이름을 사용하는 것이 좋습니다.

    GetLastError 함수를 이용하여 이전에 생성한 뮤텍스 객체가 있는지 확인합니다. 만약 이미 생성된 뮤텍스가 있으면 MessageBox 함수를 이용하여 "이미 실행 중입니다." 라는 메시지를 출력하고 프로그램을 종료합니다.

    만약 중복 실행이 아니라면 ReleaseMutex 함수를 이용하여 뮤텍스 객체를 해제하고, CloseHandle 함수를 이용하여 뮤텍스 핸들을 종료합니다.

    그 외에도 윈도우 프로그램 중복 실행 방지 방법으로는 다음과 같은 것들이 있습니다.

    1. 윈도우 클래스 이름을 고유하게 지정하는 방법
    2. 윈도우 메시지를 이용하는 방법
    3. 파일 락을 이용하는 방법

    하지만 위 방법들은 CreateMutex 함수를 이용하는 것보다 복잡하고 구현하기 어렵습니다. 따라서 가장 간단하고 효율적인 방법은 CreateMutex 함수를 이용하는 것입니다.

    Modern C++에서는 std::filesystem 라이브러리를 이용하여 파일 시스템에 파일 락을 거는 방식으로 중복 실행을 방지할 수 있습니다.

    #include <iostream>
    #include <fstream>
    #include <filesystem>
    
    namespace fs = std::filesystem;
    
    int main()
    {
        const fs::path lock_file_path = "my_program.lock";
        std::ofstream lock_file{ lock_file_path };
    
        if (!lock_file)
        {
            std::cout << "이미 실행 중입니다." << std::endl;
            return 0;
        }
    
        // 프로그램 로직
    
        return 0;
    }
    
    

    위 코드에서는 std::filesystem::path 클래스를 이용하여 파일 경로를 생성하고, std::ofstream 클래스를 이용하여 파일을 생성합니다. 이 때, 파일 경로는 실행 중인 프로그램에서 고유한 이름을 사용하는 것이 좋습니다.

    파일 생성에 실패하면 이미 다른 프로그램에서 파일을 생성한 것이기 때문에 "이미 실행 중입니다." 라는 메시지를 출력하고 프로그램을 종료합니다.

    파일 생성에 성공하면 중복 실행이 아니므로 프로그램 로직을 수행합니다.

    이 방식은 CreateMutex 함수를 이용하는 것보다 코드가 더 간결하고 읽기 쉬우며, C++17부터 표준 라이브러리에 포함되어 있으므로 이식성도 높습니다.

    댓글

Designed by Tistory.