15.4 使应用程序在同一时刻只能运行一个实例
在某些情况下,需要应用程序在同一时刻只能运行一个,例如杀毒软件等。可以在应用程序启动时创建一个有名字的互斥器(Mutexes,核心对象),如果系统中已经存在该程序的运行实例,则创建失败,程序退出;否则,程序正常启动,已创建的互斥器将阻止该程序被再次启动直到程序退出。在创建这个核心对象的程序示例(也是唯一存在的示例)退出时,核心对象被释放。
默认情况下,Visual C++(www.cppentry.com) 6.0向导为基于MFC的工程创建了一个派生自CWinApp的子类,结构如下(有删减):
class CXXApp : public CWinApp { public: CDvApp(); public: virtual BOOL InitInstance(); DECLARE_MESSAGE_MAP() }; |
可以在CXXApp::InitInstance()中创建互斥器(CXXApp为向导生成的代表应用程序的类名,依据实际工程而定),在CXXApp::ExitInstance()中销毁核心对象。为了实现该功能,可以按照以下步骤编写代码。
(1)为CXXApp添加一个HANDLE类型的私有成员变量。
(2)重载类CWinApp的ExitInstance()成员函数。这时类CXXApp代码结构如下:
//XX.h class CXXApp: public CWinApp { public: //部分代码省略 virtual BOOL InitInstance(); virtual int ExitInstance(); private: HANDLE m_hHandle; };
//XX.cpp BOOL CXXApp::InitInstance() { //相关代码,略
return TRUE; } int CXXApp::ExitInstance() { return CWinApp::ExitInstance(); }
|
(3)修改CXXApp的InitInstance()函数和ExitInstance()函数代码如下:
BOOL CXXApp::InitInstance() { m_hHandle = ::CreateMutex(NULL, TRUE, m_pszExeName); if (ERROR_ALREADY_EXISTS == GetLastError()) { AfxMessageBox(_T("该应用程序已启动!")); m_hHandle=0; return FALSE; } //相关代码,略 return TRUE; } int CXXApp::ExitInstance() { // TODO: Add your specialized code here and/or call the base class if(m_hHandle) { CloseHandle(m_hHandle); } return CWinApp::ExitInstance(); } |
【责任编辑:
夏书 TEL:(010)68476606】