怎么让程序只运行一个副本
如何让程序只运行一个副本?
偶做的一个项目,已经做了下列工作:
1.程序中通过_screen.visible=.f.将VFP窗口隐藏
2.自己设计了一个主窗口(主窗口.scx),caption="我的第一个程序",为顶层表单。
我想把这个主窗口作为我的程序主界面,如何让这个程序只运行一个副本?
------解决方案--------------------
转帖:
偶做的一个项目,已经做了下列工作:
1.程序中通过_screen.visible=.f.将VFP窗口隐藏
2.自己设计了一个主窗口(主窗口.scx),caption="我的第一个程序",为顶层表单。
我想把这个主窗口作为我的程序主界面,如何让这个程序只运行一个副本?
------解决方案--------------------
转帖:
方法有很多,大概分两种
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