어떻게 하면exe가 하나의 실례만 실행하게 합니까

2645 단어
방법1:
/*
전역 배척체를 만들고 프로세스가 시작될 때 이 배척체가 생성되었는지 확인하십시오
InitInstance()에
*/
::CreateMutex(NULL, FALSE, "MyAPP");/*상호 배타적 */if(ERROR ALREADY EXISTS = = = = GetLastError() {AfxMessageBox("Already run!") 생성;return FALSE; }
방법2:
한 프로그램이 여러 개의 실례 (프로세스) 를 실행할 수 있는데, 어떻게 하면 한 개의 실례만 실행할 수 있습니까?간단합니다. #pragma 컴파일러 명령을 사용하여 프로세스의 주소 공간에'공유 바이트'를 만들면 목적을 달성할 수 있습니다. 이'공유 바이트'의 데이터는 여러 실행 중인 프로세스에 공유됩니다. 그러면 우리는 변수를 설정합니다. 예를 들어 unsigned gnInstanceCount;실행 실례의 계수로 프로그램 입구에서 g 를 검출합니다nInstanceCount가 1인지, true는 실행을 금지합니다. 그렇지 않으면 gnInstanceCount++ 및 인스턴스를 실행합니다.
구체적으로 다음과 같다.
#pragma data_seg("Shared")//이 공유 섹션은 Shared unsigned g 라고 합니다.nInstanceCount =0;//초기에는 0 #pragma dataseg ()//설정 완료 #pragma comment(linker, "/: SECTION:Shared, RWS
")//이 말은 커넥터에 Shared를 읽기와 쓰기 공유로 설정하는 것을 알려줍니다.
자, 우리 실제적으로 작은 예를 만들어 봅시다.0은 가능하지만 다른 IDE(예: Code Block)에서는 효과가 없는 예가 있습니다.
/********************************************
콘솔 기반
********************************************/
#include using namespace std; #pragma data_seg("Shared") unsigned g_nInstanceCount = 0; #pragma data_seg() #pragma comment(linker,"/SECTION:Shared,RWS") int main() { if(g_nInstanceCount>=1) { cout<<"Can only running an instance!"<방법 3:
응용 프로그램이 하나의 실례만 실행하도록 하려면, 간단한 방법은 응용 프로그램 클래스에서 상호 배율을 사용하는 것이다. 이것은 VC 아래의 GUIDGEN을 사용할 수 있다.EXE 프로그램 생성.GUIDGEN.EXE는 VC 설치 디렉토리 CommonTools 디렉토리에 있습니다.
인스턴스
1: 대화상자 기반 프로젝트 ex1을 새로 만들고 기본 설정을 사용합니다
2:GUIDGEN으로.EXE는 글로벌 플래그를 생성합니다. #define one은 "글로벌 플래그를 생성합니다."
이 예에서 생성된 명령문은 다음과 같습니다. #define one "0xbe8e2ce1, 0xdab6, 0x11d6, 0xad, 0xd0, 0x0, 0x4c, 0x53, 0xf6, 0xe6"
3: 응용 프로그램 클래스 CEx1App::InitInstance()에서 CreateMutex 함수로 상호 배율을 만들고 함수GetLastError()를 호출합니다()
만약 결과가 ERROR 와 같다면ALREADY_EXISTS는 실행 중인 인스턴스가 FALSE로 되돌아왔다는 것을 설명합니다.
4
BOOL CEx1App::InitInstance()
{	
	handle=::CreateMutex(NULL,FALSE,one);//handle    HANDLE       

	if(GetLastError()==ERROR_ALREADY_EXISTS)	
	{	
		AfxMessageBox("         ");
		return FALSE;	
	}
}
4: CEx1App:::ExitInstance()에서 이 배율 제거
int CEx1App::ExitInstance()
{ 
	CloseHandle(handle);	
	return CWinApp::ExitInstance();
}

좋은 웹페이지 즐겨찾기