----限制打开一个程序,只运行一个程序实例-----
实现的方法有很多,但简单而常用的方法有下面几种:
方法1:
HANDLE Handle = CreateMutex( NULL, FALSE , _T("ONLY_ONE_INSTANCE"));
if(Handle == NULL)
{
// 创建 Mutex 出错,
}else
{
if (ERROR_ALREADY_EXISTS == GetLastError())
{
//已有一个实例正在运行, 退出程序
}
方法2:
if(::GlobalFindAtom( "unique_instance" )==0 )
{
/*
* 没有找到 "unique_instance" 对应的 ATOM 值,
* 所以可以认为先前没有实例运行
*/
::GlobalAddAtom( "unique_instance" );
/*
* 运行我们的实例
*/
}else
{
AfxMessageBox( "已有实例运行!" );
/*
* 结束本程序的运行
*/
}
记住当前程序退出时要调用 GlobalDeleteAtom 删除代表本实例的 ATOM 。如果忘记删除,那以后该实例程序就不能再运行了。可见该 ATOM 值不是和特定应用程序相联系的,当应用程序在没有删除ATOM值就退出后,该值并没有被操作系统删除。
这样就会遇到下面情景:假设你的程序因为某种原因非正常退出(ATOM 值没有删除),那么用户想再次运行你的程序时就会失败。因为新运行的程序总能找到 ATOM。
这种方法不好,最好别使用。
方法3:
可以通过文件映射的方法来做
创建一个有名字的映射区域, 再此仅给出思路
方法4:
可以通过在文件中设置共享节来做,在共享节中设置变量,通过变量来判断是否已有实例运行。
共享节应该放在 DLL 中,当然变量也在里面。
DLL 被我们的程序加载,然后我们改变的他的值为一个特殊的值。
每次我们的实例程序运行时都预先判断这个变量是否是我们设置的特殊值.
如果是,那就说明已有程序在运行。不是的话就设置它为特殊值,我们的程序运行