|
저도 발견하고 경악했습니다. ㅠㅠ
윈도우->계정->계정 내의 뮤텍스
로 완전히 퍼미션 분리가 된 덕분입니다. ㅠㅠ
이 경우에 해결 방법은 프로그램이 실행될 때 흔적을 남기는 것입니다.
제가 수정하는 방법은
1. 일정 시간마다 파일 로그를 남긴다 // 실행 시간과 랜덤 넘버를 남겨서 프로그램을 구분한다.
2. 서버 소켓을 열어 같은 포트 사용 여부를 체크한다. -> try catch로 에러가 나면 이미 다른 계정에서 프로그램이 실행되어 서버가 열린 상태이기 때문이라 판단한다. 그리고 더 확실히 하기 위해 간단한 패킷을 날려 프로그램 명을 확인한다.
3. 전체 프로세스를 검사하여 프로그램의 구동 여부를 확인한다.
입니다.
뮤텍스로 프로그램의 유니크 실행을 확인하는 법은 쓰레드 생성 룰로 만들어진 편법이기 때문에 이런 편법은 버리게 되는 것입니다. 앞으로는...
강재호.만해 님이 쓰신 글 :
: Windows Vista를 대비해서 이것 저것 테스트 하는 도중
:
: 두개 이상의 계정에서 저희 프로그램 (ezclick)을 중복 실행이 가능한 상황이 발생 했습니다.
:
: A라는 계정에서 ezclick을 실행 시키고 난 다음에,
:
: B라는 계정으로 사용자 전환을 한후 ezclick을 실행 시키면 실행이 됩니다. T_T
:
: ezclick.cpp 에서 그러니깐 스타터업시
:
: 뮤텍스를 통해 중복 실행 방지 루틴이 들어가 있는데도 이렇게 나와서 당황 스럽기만 합니다.
:
: 뮤텍스를 통한 중복 실행 방지 루틴은 다음과 같습니다.
:
: SECURITY_ATTRIBUTES secAttr;
: char secDesc[ SECURITY_DESCRIPTOR_MIN_LENGTH ];
: secAttr.nLength = sizeof(secAttr);
: secAttr.bInheritHandle = FALSE;
: secAttr.lpSecurityDescriptor = &secDesc;
: InitializeSecurityDescriptor(secAttr.lpSecurityDescriptor, SECURITY_DESCRIPTOR_REVISION);
: SetSecurityDescriptorDacl(secAttr.lpSecurityDescriptor, TRUE, 0, FALSE);
: const char ProgMutex[] = "ezClick";
: HANDLE hMutex = NULL;
:
: // HANDLE hMutex = CreateMutex(&secAttr, false, ProgMutex);
: //
: // if ( hMutex == NULL )
: // return 0;
: //
: // //이미 인스턴스가 생성되어 있는경우.. 종료한다....
: // if(ERROR_ALREADY_EXISTS == GetLastError())
: // return 0;
:
: if((hMutex=OpenMutex(MUTEX_ALL_ACCESS, false, ProgMutex))==NULL)
: hMutex = CreateMutex(&secAttr, true, ProgMutex);
: else{
: MessageDlg("이미 실행중입니다.", mtError, TMsgDlgButtons() << mbOK, 0);
: return 0;
:
: 한 계정에서의 중복 실행 방지는 정상 동작을 하는데,
:
: 여러 계정에서 중복 실행 방지는 안되는것 같습니다.
:
: 이걸 어떻게 해결해야 할런지 웹을 뒤지고 있지만 넘 어렵네요 T_T
|