首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > VFP >

关于程序打包生产运行时的有关问题

2012-04-24 
关于程序打包生产运行时的问题?我编写的程序打包生成后,安装运行,当使用者点击桌面程序运行快捷图标启动程

关于程序打包生产运行时的问题?
我编写的程序打包生成后,安装运行,当使用者点击桌面程序运行快捷图标启动程序,但由于误操作再次双击快捷图标又启动程序出错,请问如何能控制再次启动程序?

[解决办法]
**********设置本程序一次只能运行一个副本**********
lpWindowName="程序名称" &&你的程序名称DECLARE Integer FindWindow IN USER32.DLL String lpClassName,String lpWindowName
IF FindWindow(0,lpWindowName)#0 &&寻找窗口标题
=MESSAGEBOX("程序已经运行了",0+64,"提示")
QUIT 
ENDIF
[解决办法]
两个 Function ...EndFunc 肯定要放在主程序最后,或者一个由 set procedure to ... 指定的公用过程中。
ClearUp 主要用于 ide 调试环境,应该放在你的主程序 read events 后面,但要在(如果有) clear all/clear memory 之类的语句前面,否则 ghMutex 已被清除 clearup 将执行失败。因为在 ide 环境下,虽然程序已退出,但 vfp 并未退出,所以操作系统不会自动清除这个互斥量,所以要自己释放它,否则你的主程序会因为判断到它的存在而不重复运行。
如果你的程序代码中很多地方有这类 clear 语句,则应该将互斥句柄保留到一个这类语句清除不到的地方,例如将它保留到 _Screen 的一个属性中,修改 IsRun 为:

FUNCTION IsRun() 
DECLARE Long CreateMutex IN WIN32API String, Long, String @ 
DECLARE Long GetLastError IN WIN32API 

_Screen.AddProperty( 'hMutex', CreateMutex( NULL, 1, PROGRAM() )
RETURN ( 183 == GetLastError()) 
ENDFUNC

这样句柄值才不会被 Clear All 之类的语句清除,相应的将 ClearUp 改为:

FUNCTION ClearUp 
DECLARE Long CloseHandle IN WIN32API Long 
CloseHandle( _Screen.hMutex )
REMOVEPROPERTY( _Screen, 'hMutex' )
ENDFUNC 

对于编译后的 exe 来说,是否执行 ClearUp 都没关系,因为这个互斥量是与进程相关的,只要进程被终止(不管是正常还是被强行终止),操作系统都会自动清理与该过程相关的资源/环境。不过做为好的编程习惯,退出前主动清除自己分配的资源是应该遵守的。

热点排行