设为首页 加入收藏

TOP

15.4 使应用程序在同一时刻只能运行一个实例
2013-10-07 00:33:08 来源: 作者: 【 】 浏览:63
Tags:15.4 应用程序 同一时刻 只能 运行 一个 实例

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】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇1.1.3 是否跨平台 下一篇15.2 去除单(多)文档窗口标题栏..

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: