|
컴파일러가 떠 있는 상태에서는 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")함수가,메인폼에 해당하는 폼디자이너 창의 헨들이 리턴하는 것 같습니다.
: 이런 문제가 없게 하려면 어떻게 해야 되나요?
:
:
|