限制打开一个程序实例

原创 2007年09月13日 10:19:00

----限制打开一个程序,只运行一个程序实例-----

实现的方法有很多,但简单而常用的方法有下面几种:

方法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 被我们的程序加载,然后我们改变的他的值为一个特殊的值。
每次我们的实例程序运行时都预先判断这个变量是否是我们设置的特殊值.
如果是,那就说明已有程序在运行。不是的话就设置它为特殊值,我们的程序运行

相关文章推荐

C#限制程序只运行一个

  • 2010年12月07日 10:31
  • 5KB
  • 下载

Flex 如何限制客户端只运行一个application实例

用flex做web应用,就必须处理web应用的一个常见问题,即在同一台电脑上用不同账号登陆web应用,由于火狐了、ie7以上版本等浏览器sessionid是同一个,因此会发生a、b用户共享同一sess...

vc++2005限制只启动一个程序、进程

  • 2009年07月30日 16:40
  • 7.93MB
  • 下载

只打开应用程序的一个实例

  • 2010年08月15日 20:06
  • 55KB
  • 下载

Java Swing 每次打开只运行一个实例,并激活任务栏里的程序

import java.awt.AWTException; import java.awt.Dimension; import java.awt.Image; import java.awt.Menu...
  • lovoo
  • lovoo
  • 2016年09月14日 21:40
  • 1997

一个无聊的自动提款机程序---改进版——限制用户,超时特征

/* * PLAY_AGAIN.C * 功能:实现组件2 * * 对用户显示提示问题 * 接受输入 * 如果是y,返回0 * 如果是n,返回1 * */ #...

Winform and WPF 第二遍双击快捷方式或应用程序打开原来的应用程序而不新建一个实例[进程通信 1]

今天工作忙完之余,总结一些Winform WPF应用程序,第二遍双击快捷方式或应用程序打开原来的应用程序而不新建一个实例。 下面两个例子分别用了两种不同的方式实现了进程间的通信。   ------...
  • wzhiu
  • wzhiu
  • 2012年06月19日 15:16
  • 3074

限制打开多个程序(源码+示例)

  • 2004年07月19日 00:00
  • 155KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:限制打开一个程序实例
举报原因:
原因补充:

(最多只允许输入30个字)