关于防止程序多重运行的问题

来源:百度知道 编辑:UC知道 时间:2024/05/09 01:42:00
在写程序时有一个问题解决不了,特来求教高手指点。
此程序需要在后台做一些操作,并且程序中窗体的Visible和ShowInTaskbar属性都已经设为False,程序将来运行时,可以放到任何一个目录中。
我现在想做到,此程序的一个实例启动后(任意目录中的),先判断是否有其它的实例正在运行,如果有就循环等待其它程序实例结束后再继续执行。
程序的其它功能能已经做好了,现在就在这一个功能上卡壳了。
试过几个方法都不太理想:
1、用CreateFile 带FILE_FLAG_DELETE_ON_CLOSE创建临时文件。
2、用CreateMutex创建约定名称的互斥体。
3、用BroadcastSystemMessage或PostMessage传递自定义消息。
这几种方法都试了一下,好像都存在先前实例非正常结束,没有正确关闭某句柄,导致后面运行的实例不能正常判断先前的程序已经结束。
也许是我对这几个函数的用法不太了解,希望高手给个解决方案。不甚感谢!

是这个程序只能运行一个吗。只要一个语句就搞定了。在程序启动时加入这个语句就可以了。

Private Sub Form_Load()
If App.PrevInstance = True Then
Unload Me
MsgBox "程序已经在运行中啦。。点击确定退出"
End If
End Sub

前面几楼显然不明白楼主的意思!

楼主的意思是,如果发现程序已运行,则等待已运行程序结束,然后启动!
Private Sub Form1_Load()
DO
If App.PrevInstance=False Then Exit DO
LOOP
End sub
上面的语句,判断是否有实例运行,如果没有退出循环(启动程序),否则一直循环!

function_exit 偶的另外个号,如采纳会答分给我这个号

关于上面说的如果非正常结束不能生效的说法,这个是肯定不行的,但是,按照我上面说的第二种方法可以完美解决(我就常用这种方法,而且很简单),看下面的

Private Sub Form_Load()
On Error Resume Next
Open "c:\boot.ini" For Random Lock Read As #1 '打开并锁定文件
If Err Then MsgBox "程序以打开"
end sub

这个呢原理很简单,不用说一看就明白,而且效果绝对好,不管你用什么方法结束我的进程,我都可以正确判断,(你别又跑来告诉我别人把我的boot.ini给独占了又怎么办哈!或者说菜到问我c盘没有boot.ini呢怎么办?) 还有,你实在不想独占别的文件你可以自己在指定位置建一个,然后独占掉

我的以上两种方法均可实现任意目录任意文件名的判断随你用那个都可以,不过这种方法简单写

不对!偶还想起来了,关于我上面个号那个有人说如果被杀死了会不能正确判断说法我在