| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1348 人关注过本帖, 2 人收藏
标题:关于避免EXE重复运行的问题
只看楼主 加入收藏
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1094
专家分:2693
注 册:2015-12-30
结帖率:97.3%
收藏(2)
已结贴  问题点数:20 回复次数:28 
关于避免EXE重复运行的问题
程序代码:
DECLARE integer FindWindow  in   win32api   string   cClass,String   cCaption
if FindWindow(0,thisform.Caption)#0
    messagebox('本EXE已经运行')
endif

FindWindow(0,thisform.Caption)=0时,exe没有运行,如果大于0则表示已经运行
说明:执行的是编译后的EXE程序
问题:如果运行了程序,则FindWindow(0,thisform.Caption)非0,此时无法判断是否重复运行
解决办法:在setting.ini里写一个值,表示程序已经运行,程序退出时将这个值写为空,当再次运行时,判断这个值,如果是空则表示首次运行,否则就是重复运行
带来的问题:如果程序非正常退出,如断电、死机等,没能将那个值写为空,则以后再进入的时候则会判断为已经运行,至此卡住了

各位有什么好方法

搜索更多相关主题的帖子: 重复运行 FindWindow EXE 运行 判断 
2023-10-10 09:05
星光悠蓝
Rank: 9Rank: 9Rank: 9
来 自:山水甲天下
等 级:贵宾
威 望:52
帖 子:527
专家分:1281
注 册:2010-1-11
收藏
得分:0 
用两个值来记录,一个记录是否运行,另一个记录是否正常退出,下次如果检测为非正常退出,则可正常运行。
2023-10-10 10:16
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:709
专家分:2848
注 册:2018-3-13
收藏
得分:0 
用 api 创建互斥量、信号灯、内存映射文件 ...,这其中任意一种方法都要可靠的多

这家伙很懒,啥也没留下
2023-10-10 10:21
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1094
专家分:2693
注 册:2015-12-30
收藏
得分:0 
以下是引用星光悠蓝在2023-10-10 10:16:07的发言:

用两个值来记录,一个记录是否运行,另一个记录是否正常退出,下次如果检测为非正常退出,则可正常运行。

“是否正常退出”,这个值只能在正常退出情况下能更新,非正常退出时没机会更新
“是否运行”也是同样的情况
好像还是没法明确判断
2023-10-10 10:40
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1094
专家分:2693
注 册:2015-12-30
收藏
得分:0 
以下是引用csyx在2023-10-10 10:21:33的发言:

用 api 创建互斥量、信号灯、内存映射文件 ...,这其中任意一种方法都要可靠的多

这些方法我都不会
2023-10-10 10:41
abcde007
Rank: 1
等 级:新手上路
帖 子:26
专家分:3
注 册:2023-9-26
收藏
得分:0 
以下是引用laowan001在2023-10-10 10:40:46的发言:


“是否正常退出”,这个值只能在正常退出情况下能更新,非正常退出时没机会更新
“是否运行”也是同样的情况
好像还是没法明确判断



“非正常退出时没机会更新”,非正常退出这时候不需要更新啊。该数值没有更新恰恰说明是“非正常退出”吧。
“是否运行”也是一样的。

[此贴子已经被作者于2023-10-10 10:59编辑过]

2023-10-10 10:53
kangss
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:277
专家分:615
注 册:2014-6-12
收藏
得分:0 
回复 5楼 laowan001
禁止程序重复运行的又一方法
DECLARE integer CreateEventA IN WIN32API integer,long,long,string
DECLARE integer OpenEventA IN WIN32API integer,long,string
IF OpenEventA(2031619, .F.,myappname)0 &&myappname可以是任意文本,最好要长一点。
    =MESSAGEBOX("程序已经在运行,不要浪费资源呵!", 48, "信息提示")
    RETURN .F.
ELSE
    CreateEventA(0, .F., .F.,myappname)
ENDIF

[此贴子已经被作者于2023-10-10 11:05编辑过]

2023-10-10 11:04
kangss
Rank: 7Rank: 7Rank: 7
等 级:贵宾
威 望:14
帖 子:277
专家分:615
注 册:2014-6-12
收藏(1)
得分:8 
回复 楼主 laowan001
* 防止重复启动
DECLARE LONG CreateMutexA IN kernel32 LONG p1,LONG p2,STRING StrName
DECLARE LONG GetLastError IN kernel32

=CreateMutexA(0,0,"myexe123456")

IF GetLastError() = 183
    MESSAGEBOX('该程序已运行,不能重复运行!',48,'重复运行提示',4000)
    QUIT
ENDIF

CLEAR DLLS 'CreateMutexA','GetLastError'
2023-10-10 11:07
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:66
帖 子:1094
专家分:2693
注 册:2015-12-30
收藏
得分:0 
以下是引用abcde007在2023-10-10 10:53:16的发言:




“非正常退出时没机会更新”,非正常退出这时候不需要更新啊。该数值没有更新恰恰说明是“非正常退出”吧。
“是否运行”也是一样的。

有道理!!!!!看来我是左脚绊右脚了
好像记录一个值就够了,我试下

[此贴子已经被作者于2023-10-10 11:48编辑过]

2023-10-10 11:46
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:709
专家分:2848
注 册:2018-3-13
收藏
得分:0 
使用互斥量检测的例子

程序代码:
Declare Long CreateMutex in win32api String, Long, String
Declare Long GetLastError in win32api

If (CreateMutex(Null, 1, 'mytest') != 0) and (GetLastError() == 183)
    MessageBox('重复运行', 16)
    Quit
Else
    MessageBox('首次运行' + 0h0d0a0d0a + '别关闭我,再次运行试试')
EndIf


编译后运行试试


这家伙很懒,啥也没留下
2023-10-10 11:53
快速回复:关于避免EXE重复运行的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023904 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved