2,722
社区成员
发帖
与我相关
我的任务
分享
方法有很多,大概分两种
1. vfp 原生的方法,主程序中独占打开一个固定的表,启动第二个实例时自然无法再打开,从而判断出已有一个实例已启动;缺点:程序异常退出时可能不会自动关闭这个固定表,因此无法再次运行。
2. api 方法很多,信号灯,互斥对象, 等等...;缺点:需要熟悉 api,写较多代码
如下做一个最简单的 prg,编译成 exe 就知道了。这里用的是内存映射的 api 方法
_Screen.Visible = .F.
If IsRunAgain()
Messagebox('程序已经运行。')
Else
Wait Window Noclear '开始运行,按一个键退出 ...'
Wait Clear
Endif
Quit
Function IsRunAgain
Declare Long OpenFileMapping In WIN32API Long, Long, String
Declare Long CreateFileMapping In WIN32API Long, Long, Long, Long, Long, String
cPID = '这是我的程序'
hFile = OpenFileMapping(4, 0, cPID)
If 0 == hFile
CreateFileMapping(-1, 0, 4, 0, 1+Len(cPID), cPID+Chr(0))
Return .F.
Else
Return .T.
Endif
Endfunc