天天看點

MFC防止同一個exe應用程式多次啟動

// 唯一的一個 CLoaderApp 對象

CLoaderApp theApp;


// CLoaderApp 初始化

BOOL CModelDownLoaderApp::InitInstance()
{
	// 如果一個運作在 Windows XP 上的應用程式清單指定要
	// 使用 ComCtl32.dll 版本 6 或更高版本來啟用可視化方式,
	//則需要 InitCommonControlsEx()。否則,将無法建立視窗。
	INITCOMMONCONTROLSEX InitCtrls;
	InitCtrls.dwSize = sizeof(InitCtrls);
	// 将它設定為包括所有要在應用程式中使用的
	// 公共控件類。
	InitCtrls.dwICC = ICC_WIN95_CLASSES;
	InitCommonControlsEx(&InitCtrls);

	// 建立互斥量,檢查錯誤代碼
	HANDLE m_hMutex = CreateMutex(NULL, FALSE, _T("model"));
	DWORD nRet = GetLastError();
	if (nRet == ERROR_ALREADY_EXISTS)
	{
		AfxMessageBox(_T("exe已經打開!"));
		CloseHandle(m_hMutex);
		m_hMutex = NULL;
		return FALSE;
	}

	CWinApp::InitInstance();


	AfxEnableControlContainer();

	// 建立 shell 管理器,以防對話框包含
	// 任何 shell 樹視圖控件或 shell 清單視圖控件。
	CShellManager *pShellManager = new CShellManager;

	// 标準初始化
	// 如果未使用這些功能并希望減小
	// 最終可執行檔案的大小,則應移除下列
	// 不需要的特定初始化例程
	// 更改用于存儲設定的系統資料庫項
	// TODO: 應适當修改該字元串,
	// 例如修改為公司或組織名
	SetRegistryKey(_T("應用程式向導生成的本地應用程式"));
	
	CLoaderDlg dlg;
	m_pMainWnd = &dlg;
	INT_PTR nResponse = dlg.DoModal();
	if (nResponse == IDOK)
	{
		// TODO: 在此放置處理何時用
		//  “确定”來關閉對話框的代碼
	}
	else if (nResponse == IDCANCEL)
	{
		// TODO: 在此放置處理何時用
		//  “取消”來關閉對話框的代碼

	}

	// 删除上面建立的 shell 管理器。
	if (pShellManager != NULL)
	{
		delete pShellManager;
	}

	// 由于對話框已關閉,是以将傳回 FALSE 以便退出應用程式,
	//  而不是啟動應用程式的消息泵。
	return FALSE;
}