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
[15978] Re:prevent multiple instances.
이경문 [gilgil] 962 읽음    2002-03-05 02:54
컴파일러가 떠 있는 상태에서는 Design Form Handle이 FindWindow에 잡혀 버리기 때문입니다.^^
FindWindow보다는 Mutex를 사용하시는 것이 좋습니다.

WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
  HANDLE hMutex;
  hMutex = CreateMutex(NULL, true, "SeromeSmaatzCall");
  if (hMutex == 0 || GetLastError() != 0) { // 기존에 프로그램이 떠 있으면
    Application->MessageBoxA("프로그램이 이미 실행중입니다", "확인", MB_OK);
    return 0;
  }
  // 주절주절 해 줄거 재 주고...
  // 씨벌씨벌 하고 싶은 거 하고...
  if (hMutex != 0) CloseHandle(hMutex);
}

요놈이 또 좋은 것이 Ctrl-F2로 비정상종료를 시켜도 Mutex를 알아서 해제시켜 주더군요.


유지상 님이 쓰신 글 :
: 프로그램을 단 한번만 실행되도록 하려고 다음과 같이 코딩했습니다.
: (이때 메인폼의 클레스명은 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. ^^ 773 2002/03/11
15978     Re:prevent multiple instances. 이경문 962 2002/03/05
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.