2015-01-26 2 views
0

를 작동하지 않는 여러 인스턴스 코드를 방지 프로그램의 여러 인스턴스를 실행하려고하는 배치 스크립트를 자동으로 실행합니다. 배치 스크립트가 성공하고 실제로 여러 인스턴스를 볼 수 있습니다. 지금까지윈도우 내 응용 프로그램의 여러 인스턴스를 방지하기 위해 CreateEvent에 사용하고

조사 :

  • OutputDebug 각 인스턴스가 ERROR_ALREADY_EXISTS
  • ProcessExplorer.exe 각 인스턴스가 이벤트 "myEvent가"에 대한 핸들을 얻을 수있었습니다 것을 보여준다하지 않음을 보여줍니다.

왜 이런 일이 일어날 지 생각해 볼 수 있습니까? 어떻게 해결할 수 있습니까?

답변

1

일반적인 유틸리티 DLL에있는 아래 함수를 사용합니다. 이 방법은 WIN32에서 여러 인스턴스를 방지하는 방법을 설명하는 Microsoft 문서에서 파생됩니다.

#define STRICT 
#include <stdheaders.h> 

HANDLE ghSem; 

BOOL IExist(LPSTR lpszWindowClass) 
{ 
    HWND  hWndMe; 
    int  attempt; 

    for(attempt=0; attempt<2; attempt++) 
    { 
     // Create or open a named semaphore. 
     ghSem = CreateSemaphore(NULL, 0, 1, lpszWindowClass); 
     // Close handle and return NULL if existing semaphore was opened. 
     if((ghSem != NULL) && 
      (GetLastError() == ERROR_ALREADY_EXISTS)) 
     { // Someone has this semaphore open... 
     CloseHandle(ghSem); 
     ghSem = NULL; 
     hWndMe = FindWindow(lpszWindowClass, NULL); 
     if(hWndMe && IsWindow(hWndMe)) 
     { // I found the guy, try to wake him up 
      if(SetForegroundWindow(hWndMe)) 
      { // Windows says we woke the other guy up 
       return TRUE; 
      } 
     } 
     Sleep(100); // Maybe the semaphore will go away like the window did... 
     } 
     else 
     { // If new semaphore was created, return FALSE. 
     return FALSE; 
     } 
    } 
    // We never got the semaphore, so we must 
    // behave as if a previous instance exists 
    return TRUE; 
} 

은 당신의 WinMain에서 같은 것을 할 :

물론
if(IExist("MyWindowClass")) 
{ 
    return 1; 
} 

, 당신은 활성화로 (첫 번째 인스턴스가 아닌 경우에 할 당신이 필요로하는 무엇으로 수익을 대체 할 수있는 기존의 예).

관련 문제