C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 FAQ
C++Builder Programming FAQ
[9] [TECHNIQUE] 프로그램 한 번만 실행시키기
박지훈.임프 [cbuilder] 19887 읽음    2000-06-13 00:00
/Q//

빌더로 만든 프로그램을 한 번만 실행시키고 싶습니다.
이미 그 프로그램이 실행되어 있는데, 실수로 또 실행시키면
같은 프로그램이 두 개가 실행되어 있습니다.
실행되어 있는지를 검사하고 이미 실행되어 있다면 실행되어
있는 프로그램을 보여줄수(Show) 있는 방법이 없을까요?
델파이로는 그렇게 할 수 있는 방법을 보았던 것 같은데
빌더에서는 어떻게 할수 있는지 모르겠군요.



/A//

프로그램을 한번만 실행시키는 방법으로 쓰이는 코딩은 두가지 정도가
있습니다. 한가지는, 프로그램을 시작할때 메인폼이나 특정 서브폼의
클래스이름을 검사하는 방법이고, 두번째 방법은 '뮤텍스'라고 하는
특수한 리소스를 이용하는 방법입니다.
재미있게도, 두가지 방법은 모두 볼랜드의 델파이와 빌더 FAQ에 등록
되어있다는 거죠.

하지만, 제 생각으로는 뮤텍스를 이용한 두번째 방법을 더 권합니다.
만약 클래스 이름으로 찾을 경우, TMainForm등의 흔한 클래스 이름으로
선언된 경우엔 엉뚱한 다른 프로그램과 혼동할 가능성이 많기 때문이죠.

뮤텍스는 이러한 목적으로 사용되기 위해 만들어진 특수한 리소스입니다.
특정이름의 뮤텍스 리소스는 시스템 전반에 걸쳐 단 하나만이 선언될
수 있습니다. 그러므로, 프로그램 시작시마다 이 뮤텍스를 설정하고,
그 이전의 코드에서 설정한 이름과 같은 뮤텍스가 존재하는지를
검사하면 쉽게 이전에 그 프로그램이 실행되었었는지 알수 있죠.

프로그램이 시작되는 지점으로서 가장 제어하기 좋은 부분은,
WinMain 함수가 있는 프로젝트의 소스입니다. 여기서는, 아예 폼이
하나도 생성되기 전에 미리 체크하여 프로그램을 끝낼 수 있으니까요.

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    HANDLE Mutex;
    try
    {
        // check mutex to avoid second instance
        const char ProgMutex[] = "MyProgram"; // 여기서 자기
                         // 프로그램 고유의 이름으로 설정합니다.
                         // 아무 이름이나 상관없습니다.
        if((Mutex=OpenMutex(MUTEX_ALL_ACCESS, false, ProgMutex))==NULL)
            Mutex = CreateMutex(NULL, true, ProgMutex);
        else
            return 0;

        // 원래의 코드
        Application->Initialize();
        Application->CreateForm(__classid(TiPagerMainForm), &iPagerMainForm);
         Application->Run();
    }
    catch (Exception &exception)
    {
        Application->ShowException(&exception);
    }
    // 프로그램에 사용된 뮤텍스 해제
    ReleaseMutex(Mutex);
    return 0;
}

현재 작성중인 프로그램의 프로젝트 소스와 비교해 보시면, 어떤
부분을 추가해야 할 지 금방 짐작하실 수 있을겁니다.


+ -

관련 글 리스트
9 [TECHNIQUE] 프로그램 한 번만 실행시키기 박지훈.임프 19887 2000/06/13
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.