如何避免程序被再次启动
编号:QA001297
建立日期: 1999年7月6日 最后修改日期:2000年9月10日
所属类别:
Q
周小宁:
VB5.0企业版
Windows98
如何能知道本程序运行时又被再次启动。
1)我用VB5.0编写了一个程序并生成了A.EXE文件.
2)通过资源管理器,用鼠标单击A.EXE文件,使之运行
3)在A.EXE文件运行过程中如何防止本程序被再次运行?
A回答:
你可以利用App.PrevInstance来判断是否程序已经被运行了。例如:
If App.PrevInstance Then
MsgBox "程序已经被运行了!"
End
End If
回答这个问题后,CCXin来信反映:
我有一程序mdif.exe,想让它在本机中仅运行一个实例。使用以下代码:
Sub Main()
If App.PrevInstance= True Then
AppActivate App.Title
Exit Sub
End If
MDIF.Show
End Sub
但发现:当在另一文件夹中存在mdif.exe的副本时,双击,则照样能再次启动mdif.exe。请问如何解决?编程环境:Vb5.0中文版,PWin95
我们证实确实存在这个问题,这时可以采用这样的方法:
Declare Function GlobalAddAtom Lib "kernel32" Alias "GlobalAddAtomA" (ByVal lpString As String) As Integer
Declare Function GlobalDeleteAtom Lib "kernel32" (ByVal nATOM As Integer) As Integer
Declare Function GlobalFindAtom Lib "kernel32" Alias "GlobalFindAtomA" (ByVal lpString As String) As Integer
Public nATOM As Integer
Sub Main()
If GlobalFindAtom("MyProgram") = 0 Then
' 没有运行过
nATOM = GlobalAddAtom("MyProgram")
Else
AppActivate App.Title
Exit Sub
End If
MDIF.Show 1
GlobalDeleteAtom nATOM
End Sub
另外参考QA002404 "当程序已有一个实例时,如何调用原先的实例打开文件"。
冯桦的意见:
在主窗口的Load事件加入:
mycaption=me.caption+space(5)
'
'space(5)可以是任意非显现的字符串,如:
chr(1)+chr(2)等
'
用findwindow函数返回mycaption的句柄,若为0,则表明没有运行过(参考QA000251 "如何利用FindWindow()函数查找程序")。执行:
me.caption=mycaption
若为非0,则表明已运行。,执行:
1.showwindow函数
2.setforegroundwindow函数
参数hWnd=mycaption的句柄
(这样可以确保显现出来,因为在taskbar中用鼠标点击最小化时不能用show来显示)
3.用end退出本程序
原理:
对于本程序和复制品以及它们的下一个实例都共用一个名字,谁先用,谁独占。
win98 vb6.0下通过,有何不足之处,请指正。
William问:
操作系统: win98
编程工具: vb6sp3
问题: 我需要防止程序运行多个副本。参照了上面的第一个方法,在MSGBOX后面使用UNLOAD ME来退出程序,防止副本运行。但是实际情况在内存中仍有若干副本,副本没有反应,好象已经死机。请问怎么回事?当然,我的程序不止一个模块,有一个主FORM,两个从FORM,根据情况加载。
水平: 中级
回答:
Unload Me并不能确保你的程序终止,因为如果某个事件尚未执行完,或正在运行某个循环,都可能使程序没有终止,但窗体已经被卸载,建议使用End终止程序运行。
此问题由李海回答。
附加关键字:编程, 源程序, programming, source code, Visual Basic, VB, 其他方面, 。
| |
|
|
| |
|
|