标题:如何控制可执行文件不被重复打开
只看楼主
zhonglong
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2015-6-3
结帖率:50%
已结贴  问题点数:20 回复次数:12 
如何控制可执行文件不被重复打开
我用VFP设计了一个小程序,并将其编译成可执行文件。双击这个可执行文件,运行正常。我希望再次双击它时,它不再运行,但能最大化先打开的这个运行窗口。
搜索更多相关主题的帖子: 如何 执行文件 
2015-06-03 21:22
xs591222
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:28
帖 子:680
专家分:1287
注 册:2009-3-1
得分:4 
这个问题N年前这个论坛上就有过的——印象中的事
2015-06-03 21:26
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:396
帖 子:11713
专家分:43267
注 册:2006-5-13
得分:4 
搜索一下,保准一大把。

活到老,学到老! http://www. E-mail:hu-jj@
2015-06-03 21:28
w2009w
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:2
帖 子:190
专家分:542
注 册:2015-4-20
得分:4 
不要这么无聊好不好,貌似没有什么用!
2015-06-03 21:30
muyubo
Rank: 9Rank: 9Rank: 9
来 自:山东莱芜
等 级:蜘蛛侠
威 望:3
帖 子:471
专家分:1017
注 册:2011-3-6
得分:4 
回复 楼主 zhonglong
程序代码:
PUBL gcOldDir,vcxname

gcOldDir = SET('DEFAULT') + SYS(2003)
SET DEFA TO "&gcOldDir"
******************************************************************************
&&获取程序运行名称
Declare INTEGER GetModuleHandle IN kernel32 INTEGER lpModuleName
vcxid = ALLTRIM(STR(GetModuleHandle(0)))

Declare INTEGER GetModuleFileName IN kernel32;
INTEGER hModule,;
STRING @ lpFilename,;
INTEGER nSize

lpFilename = SPACE(250)
lnLen = GetModuleFileName (0, @lpFilename, Len(lpFilename))
vcxname = JUSTFNAME(ALLTRIM(Left (lpFilename, lnLen)))
******************************************************************************
#DEFINE ERROR_ALREADY_EXISTS 183 
DECLARE INTEGER GetLastError IN WIN32API
DECLARE INTEGER CreateMutex IN WIN32API INTEGER Security,;
SHORT Owned,;
STRING@ MutexName
DECLARE SHORT CloseHandle IN WIN32API INTEGER

PUBLIC hMutex, iResult, bCanRun
hMetux=CreateMutex(0,0,vcxname)
iResult=GetLastError()
DO CASE 
CASE iResult==0
bCanRun=.T.
CASE iResult==ERROR_ALREADY_EXISTS
MessageBox("程序已经运行。"+SPACE(2),64,"提示")
bCanRun=.F.
OTHERWISE 
bCanRun=.F.
MessageBox("GetLastError() returned "+ ltrim(str(iResult))) 
ENDCASE 

IF bCanRun ==.F.
=CloseHandle(hMutex)
QUIT
ENDIF
2015-06-03 21:37
xs591222
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:28
帖 子:680
专家分:1287
注 册:2009-3-1
得分:0 
2015-06-03 21:40
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:4 
1、用VFP自身功能,因重复打开独占表会引发异常,可用独占打开表并通过VFP出错处理过程来判断是否重复运行。
2、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
2015-06-03 23:40
muyubo
Rank: 9Rank: 9Rank: 9
来 自:山东莱芜
等 级:蜘蛛侠
威 望:3
帖 子:471
专家分:1017
注 册:2011-3-6
得分:0 
回复 楼主 zhonglong
在发表文章处,当打上关键词,下面就会出来已有的文章,可以点开浏览.


[ 本帖最后由 muyubo 于 2015-6-4 06:37 编辑 ]
2015-06-04 06:34
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:396
帖 子:11713
专家分:43267
注 册:2006-5-13
得分:0 
以下是引用w2009w在2015-6-3 21:30:59的发言:

不要这么无聊好不好,貌似没有什么用!

已有成熟的技术,借鉴一下应该不是件坏事吧?

活到老,学到老! http://www. E-mail:hu-jj@
2015-06-04 07:07
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:396
帖 子:11713
专家分:43267
注 册:2006-5-13
得分:0 

在这里搜索效果可能会更好些。

活到老,学到老! http://www. E-mail:hu-jj@
2015-06-04 07:09



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-446155-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 2.029464 second(s), 8 queries.
Copyright©2004-2025, BCCN.NET, All Rights Reserved