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
[48941] Re:[만해] Windows Vista에서 Mutex 문제
김호광 [testcode] 1416 읽음    2007-04-14 03:01
저도 발견하고 경악했습니다. ㅠㅠ

윈도우->계정->계정 내의 뮤텍스

로 완전히 퍼미션 분리가 된 덕분입니다. ㅠㅠ

이 경우에 해결 방법은 프로그램이 실행될 때 흔적을 남기는 것입니다.

제가 수정하는 방법은

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

+ -

관련 글 리스트
48894 [만해] Windows Vista에서 Mutex 문제 강재호.만해 1521 2007/04/11
48941     Re:[만해] Windows Vista에서 Mutex 문제 김호광 1416 2007/04/14
48946         Re:Re:[만해] Windows Vista에서 Mutex 문제 강재호.만해 1326 2007/04/14
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.