| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1245 人关注过本帖, 2 人收藏
标题:关于避免EXE重复运行的问题
只看楼主 加入收藏
shonken
Rank: 2
等 级:论坛游民
帖 子:116
专家分:26
注 册:2017-1-15
收藏
得分:0 
以下是引用csyx在2023-10-10 21:06:28的发言:


是的,QUIT 前应加一条 CloseHandle


继续请教下,具体怎么加CloseHandle?

是注册API,然后CloseHandle(0)?
2023-10-12 11:45
csyx
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:火星
等 级:版主
威 望:37
帖 子:703
专家分:2760
注 册:2018-3-13
收藏
得分:0 
以下是引用shonken在2023-10-12 11:45:59的发言:
具体怎么加CloseHandle?
是注册API,然后CloseHandle(0)?

意思大概是这样:
程序代码:
Declare Long CreateMutex in win32api String, Long, String
Declare Long GetLastError in win32api
Declare Long CloseHandle in win32api Long

Local hMutex

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


我也不确定15楼说的是不是这一步?如果是,则并非必要,加上它仅仅是出于遵循良好的编程习惯
重复运行时,CreateMutex 得到的句柄副本也属于系统资源,操作系统会自动清理任何被终止进程未释放的资源。这个api多用于多线程间的同步/互锁,如果是用于线程,是需要主动关闭以避免引用计数混乱的,但这里是用于进程

这家伙很懒,啥也没留下
2023-10-12 12:08
shonken
Rank: 2
等 级:论坛游民
帖 子:116
专家分:26
注 册:2017-1-15
收藏
得分:0 
以下是引用csyx在2023-10-12 12:08:58的发言:


意思大概是这样:
Declare Long CreateMutex in win32api String, Long, String
Declare Long GetLastError in win32api
Declare Long CloseHandle in win32api Long

Local hMutex

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


我也不确定15楼说的是不是这一步?如果是,则并非必要,加上它仅仅是出于遵循良好的编程习惯
重复运行时,CreateMutex 得到的句柄副本也属于系统资源,操作系统会自动清理任何被终止进程未释放的资源。这个api多用于多线程间的同步/互锁,如果是用于线程,是需要主动关闭以避免引用计数混乱的,但这里是用于进程


学习了。之前测试时加不加CloseHandle都能判断重复运动。
2023-10-12 16:18
esailor
Rank: 2
等 级:论坛游民
帖 子:17
专家分:17
注 册:2007-7-15
收藏
得分:0 
学习,多谢!
2023-10-24 09:41
sych
Rank: 6Rank: 6
等 级:侠之大者
威 望:7
帖 子:300
专家分:436
注 册:2019-10-11
收藏
得分:0 
public mmtitle,hfile
mmtitle="随便起个名字吧"
if IsRunAgain()
    MESSAGEBOX("程序已经在运行,请检查!",64+4096,"温馨提示")
    quit
ENDIF
return

Function IsRunAgain
Declare Long OpenFileMapping In WIN32API Long, Long, String
Declare Long CreateFileMapping In WIN32API Long, Long, Long, Long, Long, String
DECLARE INTEGER CloseHandle IN kernel32.DLL INTEGER hObject
cPID = mmtitle
hFile = OpenFileMapping(4, 0, cPID)
If hFile=0
    hFile = CreateFileMapping(-1, 0, 4, 0, 1+Len(cPID), cPID+Chr(0))
    Return .F.
Else
    =CloseHandle(hFile)
    Return .T.
Endif
Endfunc

2023-10-24 10:10
esailor
Rank: 2
等 级:论坛游民
帖 子:17
专家分:17
注 册:2007-7-15
收藏
得分:0 
不错,不错,多谢!
2023-10-24 11:00
pvm2000
Rank: 6Rank: 6
等 级:贵宾
威 望:24
帖 子:179
专家分:312
注 册:2022-12-22
收藏
得分:0 
简单的文件互斥,也可以解决问题
2023-10-25 12:30
sam_jiang
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:14
帖 子:786
专家分:1160
注 册:2021-10-13
收藏
得分:0 
很简单,程序启动时,任意建立一个文件,可以为空,程序结束时删除它。

每次程序启动时,检查这个文件是否存在,如果存在,说明是非正常退出。

至于程序是否已运行,用findwidow就可以了。。。
2023-10-25 20:34
Pgwyg
Rank: 2
等 级:论坛游民
帖 子:28
专家分:20
注 册:2022-6-10
收藏
得分:0 
*main.prg
*-防止程序重复运行的代码
_screen.Visible = .f.
_screen.windowstate=1
DECLARE integer FindWindow in Win32Api String, String
wclass=0
winname="水表(流量计)远程数据采集系统"
apphand = FindWindow(wclass ,winname)
IF apphand<>0
    Messagebox("程序已经运行!",48,"系统信息")
    QUIT
ENDIF
MODIFY WINDOW screen TITLE "水表(流量计)远程数据采集系统"

*系统设置
2023-12-17 06:43
快速回复:关于避免EXE重复运行的问题
数据加载中...
 
   



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

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