2014-09-13 3 views
0

MFC에서 최대 N 개의 응용 프로그램 인스턴스를 만드는 방법을 알려줄 수 있습니까?MFC 응용 프로그램 N 인스턴스 만들기

N 개의 인스턴스가 실행 중이고 하나의 인스턴스가 닫히면 하나의 새 인스턴스를 만들 수 있습니다 (단, 한 번에 N 개의 인스턴스 만 실행할 수 있음).

미리 감사드립니다. a.

+1

인스턴스를 1 개 만드는 방법을 알고 있습니까? 그것을 N 번해라. –

+0

죄송합니다 - 이해가 안됩니다. 인스턴스 수를 제한하고 싶습니다. – user2859884

+0

귀하의 질문에 인스턴스의 수를 제한하는 언급하지 않았다. 여러 인스턴스를 작성하는 방법을 알고 싶었습니다. 더 명확하게 질문을 수정하십시오. –

답변

0

잠금 파일을 사용하고 싶습니다.

CString Path; 
// better get the path to the global app data or local user app data folder, 
// depending on if you want to allow the three instances machine-wide or per user. 
// Windows' file system virtualization will make GetModuleFileName() per user: 
DWORD dw = GetModuleFileName(m_hInstance, 
       Path.GetBuffer(MAX_PATH), MAX_PATH); 
Path.ReleaseBuffer(); 
// strip "exe" from filename and replace it with "lock" 
Path = Path.Left(Path.GetLength()-3) + T("lock"); 
int i; 
// better have the locking file in your class and do a clean Close on ExitInstance()! 
CFile *pLockingFile = NULL; 
for (i = 0; i < 3; i++) // restrict to three instances 
{ 
    CString Counter; 
    Counter.Format(T("%d"), i); 
    TRY 
    { 
     pLockingFile = new CFile(Path + Counter, 
      CFile::modeCreate|CFile::modeWrite|CFile::shareExclusive); 
     pLockingFile.Close(); 
     break; // got an instance slot 
    } 
    CATCH(CFileException, e) 
    { 
     // maybe do something else here, if file open fails 
    } 
    END_CATCH 

    if (i >= 3) 
     return TRUE; // close instance, no slot available 
} 

편집 : 당신의 CMyApp::InitInstance() 추가에서, 다양한 기계 소프트웨어 잠금 다음 함수를 사용하는 대신 GetModuleFileName()를 호출하는 일반적인 응용 프로그램 폴더를 검색합니다.

#pragma warning(disable: 4996) // no risk, no fun 
BOOL GetCommonAppDataPath(char *path) 
{ 
    *path = '\0'; 

    if (SHGetSpecialFolderPath(NULL, path, CSIDL_COMMON_APPDATA, TRUE)) 
    { 
     strcat(path, T("\\MyApplication")); // usually found under C:\ProgramData\MyApplication 
     DWORD dwFileStat = GetFileAttributes(path); 
     if (dwFileStat == 0xffffffff) // no MyApplication directory yet? 
      CreateDirectory(path, NULL); // create it 

     dwFileStat = GetFileAttributes(path); // 2nd try, just to be sure 
     if (dwFileStat == 0xffffffff || !(dwFileStat & FILE_ATTRIBUTE_DIRECTORY)) 
      return FALSE; 

     return TRUE; 
    } 

    return FALSE; 
} 

참고 :이 기능은 Vista에서만 작동합니다. XP를 사용하는 경우 전역 디렉토리에 쓰기가 쉬운 작업입니다 (예 : C : \ Windows \ Temp. OS가 Vista 이상인 경우에만로드하는 헬퍼 dll에 함수를 넣었습니다. 그렇지 않으면 시스템 dll에서 해결되지 않은 참조로 인해 소프트웨어가 시작되지 않습니다.

+0

안녕하세요. Thomiel- 답장을 보내 주셔서 감사합니다. 나는 당신이 작성한 버전을 구현했다. 그러나 다른 사람이 실행 파일을 다른 디렉터리로 복사하는 것을 멈추는 것이 아니라 실행 파일의 N 개 인스턴스를 실행할 수 있습니다. 디렉토리/경로 및 사용자와 상관없이 전체 컴퓨터에 대해 최대 N 개의 인스턴스 만 잠글 수있는 방법이 있습니까? 미리 감사드립니다. – user2859884

+0

@ user2859884 : 편집을 참조하십시오. – thomiel

+0

다른 편집 : sizeof (MAX_PATH)를 코드의 MAX_PATH로 바꾸십시오! – thomiel

1

최대 n 개의 프로세스 인스턴스가 입력 할 수있는 전역 세마포를 작성할 수 있습니다. 프로세스의 n + 1 번째 인스턴스는 세마포어를 입력하지 못합니다. 물론 사용자에게 의미있는 피드백을 줄 수 있도록 잠금 작업에 대한 제한 시간을 선택해야합니다.

세마포어에 대해서는 MSDN을 살펴볼 수 있습니다.

관련 문제