如何让程序只运行一个副本?

jinancf 2014-07-09 08:50:43
偶做的一个项目,已经做了下列工作:
1.程序中通过_screen.visible=.f.将VFP窗口隐藏
2.自己设计了一个主窗口(主窗口.scx),caption="我的第一个程序",为顶层表单。

我想把这个主窗口作为我的程序主界面,如何让这个程序只运行一个副本?
...全文
155 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
十豆三 2014-07-10
  • 打赏
  • 举报
回复
引用 5 楼 jinancf 的回复:
还有一个问题,wait clear在这里是必须的吗?
整个 Wait 是为了你测试时是已运行了一个,还是正常运行,真正使用时完全可以不要 Wait 2句。
jinancf 2014-07-09
  • 打赏
  • 举报
回复
通过了,谢谢。 不过不太明白 Declare Long OpenFileMapping In WIN32API Long, Long, String Declare Long CreateFileMapping In WIN32API Long, Long, Long, Long, Long, String 这两句是什么意思,OpenFileMapping和CreateFileMapping是windows的API函数还是VFP中的API函数?在哪里能看到它们的说明?
oldbbb 2014-07-09
  • 打赏
  • 举报
回复
也可用 API CreateMutex() 创建一个互斥体。 DECLARE LONG CreateMutex IN Kernel32 STRING@, LONG, STRING@ DECLARE LONG GetLastError IN Kernel32 DECLARE LONG CloseHandle IN Kernel32 LONG szPrg = PROGRAM() hMutex = CreateMutex(NULL, 0, @szPrg) IF GetLastError() != 183 && ERROR_ALREADY_EXISTS MESSAGEBOX(szPrg + " 正常启动运行") ELSE MESSAGEBOX(szPrg + " 不能重复运行") ENDIF CloseHandle(hMutex) CLEAR DLLS RETURN
十豆三 2014-07-09
  • 打赏
  • 举报
回复
转帖:
方法有很多,大概分两种

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
jinancf 2014-07-09
  • 打赏
  • 举报
回复
还有一个问题,wait clear在这里是必须的吗?
十豆三 2014-07-09
  • 打赏
  • 举报
回复
API,百度搜索。

2,722

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧