BLOG main image
분류 전체보기 (376)
Yuno (176)
Travel (99)
Culture (46)
Other (13)
Programming (13)
Picture (22)

«   2010/03   »
  1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31      
1,245,837 Visitors up to today!
Today 91 hit, Yesterday 337 hit
[Yuno.org, 2008/11/02 02:19, Programming]


소프트웨어가 중복 실행 되지 않게 하기 위해서 사용하는방법. 몇가지 방법이 있다.

온라인 게임 클라이언트들이 대부분 이 방법들을 사용하고 있다. 따라서 멀티로더와 같은 것을 만들때 대부분 별도의 디버거를 어플리케이션에 붙여서 관련 함수들을 찾아서 사용한다. ;;

아무튼, single instance를 위한 작업이라면 그냥 아에 알려진 방법을 전부 다 섞어서 사용해도 될 것 같다. -_-..
그러면 멀티로더를 만드는 사람이 '한가지'를 발견해서 수정해도 작동 되지 않음을 알고 포기 할 수도 있고 (가능성 낮은가-_-).. 최소한 작업시간을 10초라도 더 증가 시킬 수 있으니 ...

사실 대부분의 방법들은 그 목적을 위해서 만들어 졌다기 보다는 다른 용도로 만들어진 것들이지만 그것들을 활용해서 이러한 효과를 볼 수 있는 것이다. 예를 들어 뮤텍스나 세마포어, data_seg 같은 것들은 쓰레드간의 데이터 공유를 위해서 존재 하는 것들인데 이것들을 활용 하는거다. 만세!

뭐 암튼, 뮤텍스와 data_seq의 예제를 대충 남겨둔다. FindWindow야 워낙 알려진 것이니까 스킵.

아.. 그리고 요즘은 별도의 보안 프로그램(HackShield, GameGuard)을 이용하기도 한다.

Mutex

#ifdef _SINGLE_INSTANCE
  Char  sMutexName[ MAX_PATH ];
  ::_stprintf( sMutexName, _T( "[ApplicationName].SingleInstance" ) );
  this->hSingleInstanceMutex = ::UNICreateMutex( NULL, YES, sMutexName );
  if( ::GetLastError() == ERROR_ALREADY_EXISTS )
  {
   if( ::WaitForSingleObject( this->hSingleInstanceMutex, 5000 ) == WAIT_TIMEOUT )
   {
    ::exit( 0 );
   }
  }
#endif


#pragma data_seg()

#define _INSTANCE_NAME  "[Applicatipn].SingleInstance"
#pragma data_seg(_INSTANCE_NAME)
DWORD   _InstanceCount=0;
#pragma data_seg()
#pragma comment(linker, "/section:" _INSTANCE_NAME ",rws")


_InstanceCount++;
if ( _InstanceCount > 1 )
{
   ::exit( 0 );
}


아 사실 자세히 전부 다 쓰려고 했는데..
귀찮다...



--
Name
Password
Homepage
Secret