MFC에서 최대 N 개의 응용 프로그램 인스턴스를 만드는 방법을 알려줄 수 있습니까?MFC 응용 프로그램 N 인스턴스 만들기
N 개의 인스턴스가 실행 중이고 하나의 인스턴스가 닫히면 하나의 새 인스턴스를 만들 수 있습니다 (단, 한 번에 N 개의 인스턴스 만 실행할 수 있음).
미리 감사드립니다. a.
MFC에서 최대 N 개의 응용 프로그램 인스턴스를 만드는 방법을 알려줄 수 있습니까?MFC 응용 프로그램 N 인스턴스 만들기
N 개의 인스턴스가 실행 중이고 하나의 인스턴스가 닫히면 하나의 새 인스턴스를 만들 수 있습니다 (단, 한 번에 N 개의 인스턴스 만 실행할 수 있음).
미리 감사드립니다. a.
잠금 파일을 사용하고 싶습니다.
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에서 해결되지 않은 참조로 인해 소프트웨어가 시작되지 않습니다.
안녕하세요. Thomiel- 답장을 보내 주셔서 감사합니다. 나는 당신이 작성한 버전을 구현했다. 그러나 다른 사람이 실행 파일을 다른 디렉터리로 복사하는 것을 멈추는 것이 아니라 실행 파일의 N 개 인스턴스를 실행할 수 있습니다. 디렉토리/경로 및 사용자와 상관없이 전체 컴퓨터에 대해 최대 N 개의 인스턴스 만 잠글 수있는 방법이 있습니까? 미리 감사드립니다. – user2859884
@ user2859884 : 편집을 참조하십시오. – thomiel
다른 편집 : sizeof (MAX_PATH)를 코드의 MAX_PATH로 바꾸십시오! – thomiel
최대 n 개의 프로세스 인스턴스가 입력 할 수있는 전역 세마포를 작성할 수 있습니다. 프로세스의 n + 1 번째 인스턴스는 세마포어를 입력하지 못합니다. 물론 사용자에게 의미있는 피드백을 줄 수 있도록 잠금 작업에 대한 제한 시간을 선택해야합니다.
세마포어에 대해서는 MSDN을 살펴볼 수 있습니다.
인스턴스를 1 개 만드는 방법을 알고 있습니까? 그것을 N 번해라. –
죄송합니다 - 이해가 안됩니다. 인스턴스 수를 제한하고 싶습니다. – user2859884
귀하의 질문에 인스턴스의 수를 제한하는 언급하지 않았다. 여러 인스턴스를 작성하는 방법을 알고 싶었습니다. 더 명확하게 질문을 수정하십시오. –