|
지금 다른 방법 찾다가 포기 해버렸고요 흑~
기냥 프로세스 리스트 뒤져서 실행 되어 있는지로 판단 하고 작업 할려고 합니다.
비스타 때문에 이래 저래 고생이 많네요 흑~
김호광 님이 쓰신 글 :
: 저도 발견하고 경악했습니다. ㅠㅠ
:
: 윈도우->계정->계정 내의 뮤텍스
:
: 로 완전히 퍼미션 분리가 된 덕분입니다. ㅠㅠ
:
: 이 경우에 해결 방법은 프로그램이 실행될 때 흔적을 남기는 것입니다.
:
: 제가 수정하는 방법은
:
: 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
|