在同一时间、同一台机器上如何禁止同一个应用程序启动多个实例 ( 积分: 20 )

  • 主题发起人 主题发起人 jsw0525
  • 开始时间 开始时间
J

jsw0525

Unregistered / Unconfirmed
GUEST, unregistred user!
我的要求是在同一时间、同一台机器上如何禁止同一个应用程序启动多个实例,也就是说只能启动一次,不能启动多个一样的应用程序。我是下面这样写的,可是不行。(注意:如果把他写到一个BUTTON按纽底下,运行时用鼠标点按纽在点第2次的时候可以,但不是我所要的要求),各位大虾帮帮我,谢谢<br><br>procedure TForm1.FormCreate(Sender: TObject);<br>var<br> iprgHandle:cardinal;<br> ZAppName:Array[0..127] of char;<br> temptitle:string;<br>begin<br> &nbsp;temptitle:=application.Title;<br> &nbsp;application.Title:='cxp';<br> &nbsp;strpcopy(ZappName,temptitle);<br> &nbsp;iprgHandle:=Findwindow(nil,zappName);<br> &nbsp;if iprgHandle&amp;gt;0 then<br> &nbsp;begin<br> &nbsp; &nbsp;application.MessageBox('该程序已经运行!!!','警告',mb_ok);<br> &nbsp; &nbsp;application.Terminate;<br> &nbsp;end;<br> end;
 
我的要求是在同一时间、同一台机器上如何禁止同一个应用程序启动多个实例,也就是说只能启动一次,不能启动多个一样的应用程序。我是下面这样写的,可是不行。(注意:如果把他写到一个BUTTON按纽底下,运行时用鼠标点按纽在点第2次的时候可以,但不是我所要的要求),各位大虾帮帮我,谢谢<br><br>procedure TForm1.FormCreate(Sender: TObject);<br>var<br> iprgHandle:cardinal;<br> ZAppName:Array[0..127] of char;<br> temptitle:string;<br>begin<br> &nbsp;temptitle:=application.Title;<br> &nbsp;application.Title:='cxp';<br> &nbsp;strpcopy(ZappName,temptitle);<br> &nbsp;iprgHandle:=Findwindow(nil,zappName);<br> &nbsp;if iprgHandle&amp;gt;0 then<br> &nbsp;begin<br> &nbsp; &nbsp;application.MessageBox('该程序已经运行!!!','警告',mb_ok);<br> &nbsp; &nbsp;application.Terminate;<br> &nbsp;end;<br> end;
 
大虾们,帮忙呀<br>我在线等待,谢谢,我好急的
 
if(CreateMutex(nil,false,'某个字符串')&amp;lt;&amp;gt;0) then<br> &nbsp;begin<br> &nbsp;if(ERROR_ALREADY_EXISTS=GetLastError()) then<br> &nbsp; &nbsp; 前面已经启动了这个程序<br> &nbsp; &nbsp;else<br> &nbsp; &nbsp; 这是第一个程序启动<br> &nbsp;end<br>else<br> &nbsp;系统错误<br> &nbsp;<br>某个字符串 是指 你自己写一个独一无二的字符串,可以乱写alpdheui<br>这个字符串要写乱一点,避免和其他程序使用mutux用的字符串相同<br>但是要注意它不能包含“/”,样子要和合法的文件名差不多(就是最好不要~!@#$%^之类的符号,但是帮助上也没说这些符号不行,帮助上只说“/”不行,不过只使用字母、数字是肯定好的)
 
同意楼上
 
你这也应该可以,出不什么问题?
 
to:Pipi.<br>老兄,真的太感谢您了。分数马上就给你,首先谢谢您<br>我对delphi熟悉一点,但是我上面说的这个要求现在单位要求用vc写,我想请问用vc怎么写,你知道吗?不胜感激,分数还可以给你加,谢谢您
 
而且我想知道,我自己上面那样写为什么不行呢????<br>谢谢各位大虾了
 
用FindWindow来判别程序有没有第二次运行光靠windowname是不够的,还得有classname<br>改成这个就行了<br> &nbsp;sClassName, sTitle: string;<br>begin<br> &nbsp;sClassName := application.ClassName;<br> &nbsp;sTitle := application.Title;<br> &nbsp;application.Title := SDG12-EWD-23D-GHTF; //更改当前app标题<br> &nbsp;HW := findwindow(pchar(sClassName), pchar(sTitle));<br> &nbsp;if HW &amp;lt;&amp;gt; 0 then<br> &nbsp;begin<br> &nbsp; &nbsp;application.MessageBox('程序已经运行!','提示',MB_OK);<br> &nbsp; &nbsp;application.Terminate;<br> &nbsp;end;<br> &nbsp;application.Title := sTitle; //恢复app标题<br> &nbsp; <br>采用pipi临界区互斥的方式也不错<br><br><br>
 
你的工程启动后实际上有两个window<br>一个是Form1 一个Project1 project1是看不见的<br>Findwindow都可以可以找到他们<br>你的枚举所有窗体 看看是不是这样<br>换句话说 <br>的代码这样改一下 application.Title:='cxp'+temptitle<br>这样你点多少次程序也关不掉<br><br>但这样<br>iprgHandle:=Findwindow(nil,'Form1'); 或<br>iprgHandle:=Findwindow('TForm1',nil);<br>按钮点一次就关了<br> &nbsp;
 
vc这样写:<br>if(CreateMutex(NULL,0,&quot;某个字符串&quot;)!=0)<br> &nbsp;{<br> &nbsp;if(ERROR_ALREADY_EXISTS==GetLastError()) <br> &nbsp; &nbsp; {<br> &nbsp; &nbsp; 前面已经启动了这个程序<br> &nbsp; &nbsp; }<br> &nbsp; &nbsp;else<br> &nbsp; &nbsp; {<br> &nbsp; &nbsp; 这是第一个程序启动<br> &nbsp; &nbsp; }<br> &nbsp; }<br>else<br> &nbsp;系统错误<br>
 
TO:Pipi., <br>非常的感谢你,你的方法我试了,可以。请看我里面的注释说明,然后请告诉我,谢谢<br> if(CreateMutex(NULL,0,&quot;某个字符串&quot;)!=0)<br> &nbsp;{<br> &nbsp; if(ERROR_ALREADY_EXISTS==GetLastError()) <br> &nbsp; &nbsp; {<br> &nbsp; &nbsp; &nbsp; &nbsp;MessageBox(&quot;前面已经启动了这个程序&quot;);<br> &nbsp; &nbsp; &nbsp; &nbsp;//在这个地方需要加一句话,退出应用程序,在DELPHI里面是application.Terminate.在VC里面是怎么写的呢?谢谢<br> &nbsp; &nbsp; }<br> &nbsp; &nbsp;else<br> &nbsp; &nbsp; {<br> &nbsp; &nbsp; MessageBox(&quot;这是第一个程序启动&quot;);<br> &nbsp; &nbsp; }<br> &nbsp; }<br> &nbsp;else<br> &nbsp; &nbsp; &nbsp;MessageBox(&quot;系统错误&quot;);
 
TO:Avalon<br>你的方法我也试了,确实相当好,谢谢<br>我现在要用VC做,请将你告诉我的方法用VC写好吗?<br>谢谢<br>我对VC只懂一点皮毛,但是公司要用VC我没办法,为了生存,谢谢您们了
 
program DZTX;<br>uses<br> &nbsp;Forms, windows,<br> &nbsp;main in 'main.pas' {Form1},<br>{$R *.res}<br>var<br> &nbsp;MutexHandle: THandle;<br>begin<br> &nbsp; &nbsp; MutexHandle := CreateMutex(nil, TRUE, 'MysampleAppMutex');<br> &nbsp; if MutexHandle &amp;lt;&amp;gt; 0 then<br> &nbsp; &nbsp; begin<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if GetLastError = ERROR_ALREADY_EXISTS then<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MessageBox(0, '该程序已经运行!','My Program', mb_IconHand);<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; CloseHandle(MutexHandle);<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Halt;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;end;<br> &nbsp; &nbsp; end;<br><br> &nbsp; &nbsp; Application.Initialize;<br> &nbsp; &nbsp; Application.Title := 'My Program';<br> &nbsp; &nbsp; Application.CreateForm(TForm1, Form1);<br> &nbsp;Application.Run;<br>end.
 
to:qiuqiu133;fuzengbin,<br>请将你们的方法改成VC来实现,我现在需要用VC来实现,谢谢你们。<br><br><br>TO:Pipi., <br>非常的感谢你,你的方法我试了,可以。请看我里面的注释说明,然后请告诉我,谢谢<br> if(CreateMutex(NULL,0,&quot;某个字符串&quot;)!=0)<br> &nbsp;{<br> &nbsp; if(ERROR_ALREADY_EXISTS==GetLastError()) <br> &nbsp; &nbsp; {<br> &nbsp; &nbsp; &nbsp; &nbsp;MessageBox(&quot;前面已经启动了这个程序&quot;);<br> &nbsp; &nbsp; &nbsp; &nbsp;//在这个地方需要加一句话,退出应用程序,在DELPHI里面是application.Terminate.在VC里面是怎么写的呢?谢谢<br> &nbsp; &nbsp; }<br> &nbsp; &nbsp;else<br> &nbsp; &nbsp; {<br> &nbsp; &nbsp; MessageBox(&quot;这是第一个程序启动&quot;);<br> &nbsp; &nbsp; }<br> &nbsp; }<br> &nbsp;else<br> &nbsp; &nbsp; &nbsp;MessageBox(&quot;系统错误&quot;);
 
使用CreateMutex要注意这样一个问题<br>在你程序不正常关闭时 这个全局互斥对象肯能没有释放<br>导致你操作系统不重启就没法启动<br>所以一定要保证 CloseHandle(MutexHandle);<br>再退出时的执行<br><br>至于VC &nbsp;好几年不用了
 
to:qiuqiu133;fuzengbin,<br>请将你们的方法改成VC来实现,我现在需要用VC来实现,谢谢你们。<br>我在线等待,谢谢
 
#include &amp;lt;stdlib.h&amp;gt;<br><br>application.Terminate 在vc中用 exit(0); 代替
 
Avalon只知其一不知其二<br>1、因为CreateMutex只执行一次,而不是不可预知的无限次数,所以不必closehandle了,你要closehandle也没关系,记得必须是程序退出的时候closehandle,而不能过早closehandle<br>2、即使是程序不正常关闭,mutex也被操作系统释放,不用担心,如果出现使用不了的情况,那除非是操作系统也快完蛋了,马上就要崩溃了,你的程序运行不运行都无所谓了 &nbsp;<br>
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部