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

C++빌더 Q&A
C++Builder Programming Q&A
[16217] Re:prevent multiple instances.
^^ [] 772 읽음    2002-03-11 21:12

멀티인스턴스 방지 기법은 여러가지가 많이 존재합니다.
자신이 편하게 쓸 수 있는 방법을 사용하시면 됩니다.
제가 잘 사용하는 멀티인스턴스 방지기법을 아래에 개제합니다.
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    HANDLE  mutex;
    try
    {
        // 단일 프로그램 띄우기 ------------------------------
        const char mutexname [] = "HanriMansei";
        mutex = OpenMutex (0, false, mutexname);
        if ( mutex == NULL )   mutex = CreateMutex (NULL, true, mutexname);
        else                   return 0;
        // ---------------------------------------------------

        Application->Initialize();

        Application->CreateForm(__classid(TForm_Main), &Form_Main);
    }
...

이와같이 하시면 별문제 없을 것입니다. 원리는 구현하신 방법과 동일한 방법입니다. HanriMansei라는 mutex object를 열어보고 있으면 이미 실행된 것으로 판단하는 것이죠. 다른 방법으로는 MMF(Memory Mapped File)을 이용하는 방법도 있구요. 여러가지 많이 있습니다. 종류는 많으나, 원리는 마찬가지입니다. 편하신 대로 활용하시면 됩니다.

애고, 자료검색하다 질문을 봐서, 대답이 없나 보다하고 답변드렸는데, 경문님이 이미 답변을 하셨네요. 애구~, 지우기도 그렇고, 그냥 참고하세여. (괜히 쓸데없는 일했당. -____________-;)





유지상 님이 쓰신 글 :
: 프로그램을 단 한번만 실행되도록 하려고 다음과 같이 코딩했습니다.
: (이때 메인폼의 클레스명은 TMainForm이였고, 그 폼의 caption 은 "FoxPapers wow" 였습니다.)
:
: //TODO -c fill: run only once.
: WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
: {
:   try
:   {
:     HWND hAnother = FindWindow("TMainForm","FoxPapers wow");
:     if (hAnother) {
:       SetForegroundWindow(hAnother);
:       return 0;
:     }
:     Application->Initialize();
:     Application->HelpFile = ExtractFilePath(Application->ExeName) + "help\\foxpapers.hlp";
:     Application->CreateForm(__classid(TMainForm), &MainForm);
:     Application->CreateForm(__classid(TMainOptionForm), &MainOptionForm);
:     ShowWindow(Application->Handle, SW_HIDE);
:     Application->ShowMainForm=false;
:
:     Application->Run();
:   }
:   catch (Exception &exception)
:   {
:     Application->ShowException(&exception);
:   }
:   return 0;
: }
:
:
: 이렇게 코딩하였더니, 볼렌드빌더가 실행중이지 않은 상태에서는
: 프로그램이 제대로 돌아갑니다.
: 즉, 기대했던 대로,프로그램이 한 번 실행되면, 또다른 인스턴스는 생성되지 않게 됩니다.
: 그런데 볼렌드빌더가 실행중인 경우는 얘기가 달라집니다.
: 위의 코드가 들어있는 프로젝트르 볼렌드빌더로 연 상태에서 Run을 클릭할 경우는,
: 프로그램이 실행되지 않습니다.
: 즉, 이 경우는 hAnother 의 값이 NULL 이 아닌 값이 됩니다.
: 프로젝트를 열고 나서 Run을 누를 경우는, FindWindow("TMainForm","FoxPapers wow")함수가,메인폼에 해당하는 폼디자이너 창의 헨들이 리턴하는 것 같습니다.
: 이런 문제가 없게 하려면 어떻게 해야 되나요?
:
:

+ -

관련 글 리스트
15974 prevent multiple instances. 유지상 783 2002/03/04
16217     Re:prevent multiple instances. ^^ 772 2002/03/11
15978     Re:prevent multiple instances. 이경문 962 2002/03/05
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.