文档章节

防多实例运行

rise-worlds
 rise-worlds
发布于 2016/06/20 13:38
字数 657
阅读 2
收藏 0

一个程序只运行一个实例(或限制实例数量)通常可以采用如下方法:
1)FindWindow 之<窗口标题>
       通过查找窗口标题来确定上一实例是否正在运行,不适合窗口标题动态变化的程序。
2)FindWindow 之<任务栏按纽标题>
       通过查找任务栏按纽标题来确定上一实例是否正在运行,不适合按纽标题动态变化的程序(如Winamp)。通常情况下,该方法还是优先考虑,因为按纽标题是一般是固定的。
3)Window Property
       将某个数据(可以是字符串或句柄)通过SetProp加入到指定窗口的property list,程序运行时枚举窗口并检查该数据是否存在来确定上一实例是否正在运行。
4)全局Atom
       将某个特定字符串通过GlobalAddAtom加入全局原子表(Global Atom Table),程序运行时检查该串是否存在来确定上一实例是否正在运行。该方法有个局限,就是程序终止前必须显式调用GlobalDeleteAtom来释放atom,否则该atom不会自动释放,如果程序运行时意外终结了,那么下一个实例就无法正常执行。早期版本的realplayer就存在这个现象,不知道是不是采用了该方法。
5)Mutex/Event/Semaphore
       通过互斥对象/信号量/事件等线程同步对象来确定实例是否存在,在NT下要注意权限问题(SID)。
6)DLL全局共享区域
       VC下的DLL工程可以通过下面代码来建立一个进程间共享数据段:
       #pragma data_seg(".share")
       //shared for all processes that attach to the dll
       DWORD dllgs_dwRunCount = 1; //一定要在这里对变量进行初始化,否则工夫白做!
       #pragma data_seg()
       #pragma comment(linker,"/section:.share,rws")
       导出3个函数,分别为:
       DWORD IncRunCount(void); //运行计数器加1,返回计数器结果
       DWORD DecRunCount(void); //运行计数器减1,返回计数器结果
       DWORD GetRunCount(void); //取当前运行计数器
       由于DLL全局共享段在映射到各个进程地址空间时仅会被初始化一次,并且是在首次被windows加载时,所以利用该共享段数据就能对程序实例进行可靠计数。
7)内存映射文件(File Mapping)
       通过把程序实例信息(如窗口句柄、计数器等等)放置到跨进程的内存映射文件,同样可以控制程序实例运行的数量,道理与DLL全局共享区域类似。

本文转载自:http://www.cnblogs.com/flying_bat/archive/2007/10/30/942656.html

共有 人打赏支持
上一篇: 撒旦是天使
rise-worlds

rise-worlds

粉丝 2
博文 1755
码字总数 0
作品 0
深圳
程序员
私信 提问
mzphp v2.0,一日开数站 PHP 极速框架

mzphp v2.0 发布,此版本特性: 性能,高性能极致加载、高效率编译和读取! 清晰,大量注释及实例,几分钟就上马进门! 小巧,整个框架 400k,几乎没有冗余代码! 奔放,支持 http 和 cli 双...

deajunny
2015/11/29
5.3K
35
深度分析JavaScript创建防篡改对象的

本文实例讲述了JavaScript创建防篡改对象的方法。分享给大家供大家参考,具体如下: 之前的 JavaScript,开发人员可能会意外修改了别人的代码,甚至重写原生对象!现在,在 ECMAScript 5 中可...

前端小攻略
2018/12/30
0
0
游戏联运平台

本平台采用java开发,让您快速建立游戏联运系统,安全,稳定可靠,功能强大,易于扩展。 前段支持 android,ios嵌入游戏联运,支持 移动联通电信充值卡,支付宝,银联,微信,等支付。 后端,...

gzts
2016/03/18
3
0
如何为企业快速设计高可用的阿里云架构

前言  近些年阿里云可以说是非常火爆的一个话题,相信熟悉阿里云产品的朋友都知道阿里云的这句代言: “阿里云让高可用更简单”  实际是确实是这么回事,而近几年也越来越多的企业都在普及...

甘兵
2018/10/29
0
0
高防服务器租用需要注意哪些什么?

高防服务器主要是针对企业用户的,相对来说,这些企业用户对于网络安全的要求更高,高防服务器给用户提供了更加安全的网络运行环境,为企业客户提供安全的保证。在租用高防服务器之前,都需要...

李淇
2018/09/05
0
0

没有更多内容

加载失败,请刷新页面

加载更多

C++随笔(四)Nuget打包

首先把自己编译好的包全部准备到一个文件夹 像这样 接下来新建一个文本文档,后缀名叫.nuspec 填写内容 <?xml version="1.0"?><package xmlns="http://schemas.microsoft.com/packaging/201......

Pulsar-V
36分钟前
0
0
再谈使用开源软件搭建数据分析平台

三年前,我写了这篇博客使用开源软件快速搭建数据分析平台, 当时收到了许多的反馈,有50个点赞和300+的收藏。到现在我还能收到一些关于dataplay2的问题。在过去的三年,开源社区和新技术的发...

naughty
今天
3
0
Python3的日期和时间

python 中处理日期时间数据通常使用datetime和time库 因为这两个库中的一些功能有些重复,所以,首先我们来比较一下这两个库的区别,这可以帮助我们在适当的情况下时候合适的库。 在Python文...

编程老陆
今天
2
0
分布式面试整理

并发和并行 并行是两个任务同时进行,而并发呢,则是一会做一个任务一会又切换做另一个任务。 临界区 临界区用来表示一种公共资源或者说是共享数据,可以被多个线程使用,但是每一次,只能有...

群星纪元
今天
3
0
手机通过wifi遥控arduino

手机下载Blinker 从Blinker官网下载手机App,安装到手机。 手机连接WiFi。 点击我的设备右上角的"+"添加设备,选择Arduino -> wifi接入,复制密钥以备后续使用。 点击新建的设备,可以在新界...

davidwbnu
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部