如何避免一个程序重复运行?(50分)

  • 主题发起人 主题发起人 Ch4o.Jt
  • 开始时间 开始时间
C

Ch4o.Jt

Unregistered / Unconfirmed
GUEST, unregistred user!
偶写了一个EXE,只有十多KB,没有任何窗口的,只给它运行一次,如何避免它重复运行的...<br>是否应该给它注册一个窗口类,然后用FindWindow来判断?各位大哥,还有什么好的方法不? 小弟,谢先了~! ^_^
 
写全局元素的惟一字符串的方法:<br>在窗体的create中写<br>var<br> &nbsp;Hold:String;<br>Found:HWND;<br>begin<br>Hold:=Application.title;<br>Application.Title='OnlyOne'+IntToStr(HInstance);//暂时修改title<br>Found:=FindWindow(nil,pchar(ZAppName));<br>Application.title:=Hold;<br>if Found&lt;&gt;0 then<br>begin<br> &nbsp;ShowWindow(Found,SW_RESTORE);<br> &nbsp;Application.Terminate;<br>end;<br>end;
 
也可以用创建互斥对象的方法
 
好像有个函数能判断,如果已经运行了,就不能再打开了。不过忘了
 
教给你一个最简单的方式:<br>1、建立一个一个字段的数据表,打开后写一个标志,推出后修改标志,根据标志判断<br>2、建立一个文件关闭后退出,文件打开是不能继续写的。<br>嘿嘿,办法很笨高手勿笑!
 
偶是纯Pascal语言写的,根本没有窗口...<br>又怎么能用窗体的create..-_-o
 
查找进程,看进程是否存在
 
昨天才写的:在工程起动时判断,'Logon'为exe文件的caption,也就是在任务栏里显示的标题<br>program Project1;<br><br>uses<br> &nbsp;Forms,Windows,Dialogs,SysUtils,<br> &nbsp;Unit1 in 'Unit1.pas' {Form1},<br><br>{$R *.res}<br>var<br> &nbsp;MutexH,FwH: THandle;<br><br>begin<br> &nbsp;MutexH := CreateMutex(nil,True,'Logon');<br> &nbsp;if MutexH&lt;&gt;0 then<br> &nbsp;begin<br> &nbsp; &nbsp;if GetLastError = ERROR_ALREADY_EXISTS then<br> &nbsp; &nbsp;begin<br>// &nbsp; &nbsp; &nbsp;Application.MessageBox('程序已经运行','提示',MB_OK);<br> &nbsp; &nbsp; &nbsp;FwH := FindWindow(nil,'Logon');<br> &nbsp; &nbsp; &nbsp;if FwH &lt;&gt;0 then<br> &nbsp; &nbsp; &nbsp;begin<br> &nbsp; &nbsp; &nbsp; &nbsp;ShowWindow(FwH,SW_RESTORE);<br> &nbsp; &nbsp; &nbsp;end;<br>// &nbsp; &nbsp; &nbsp;Format('MutexH=%d,FwH=%d',[MutexH,FwH]);<br> &nbsp; &nbsp; &nbsp;ShowMessage(Format('MutexH=%d,FwH=%d',[MutexH,FwH]) );<br> &nbsp; &nbsp; &nbsp;CloseHandle(FwH);<br> &nbsp; &nbsp; &nbsp;ReleaseMutex(MutexH);<br> &nbsp; &nbsp; &nbsp;Exit;<br><br> &nbsp; &nbsp;end;<br><br> &nbsp;end;<br><br> &nbsp;Application.Initialize;<br> &nbsp;Application.Title := 'Logon';<br> &nbsp;Application.CreateForm(TForm1, Form1);<br>// &nbsp;Application.MessageBox('sdf','information',MB_OK);<br> &nbsp;Application.Run;<br><br>end.
 
防止程序被多次运行有很多办法,本论坛已讨论多次,最简单是在project的<br>application.run前加入判断if findwindow(.... then application.run;<br>或者:<br>begin<br> &nbsp;if findwindow('TApplication','Test')&lt;&gt;0 then Halt;<br> &nbsp;//'Test' is Application.Title <br> &nbsp;Application.Initialize;<br> &nbsp;Application.Title := 'Test';<br><br> &nbsp;...;<br><br> &nbsp;Application.Run;<br>end.
 
用互斥<br>先OpenMutex,如果返回值=0就createCreateMutex(),如果不为0就说明已经运行了
 
既然没有窗口可以用下全局原子表信息来实现此功能:<br><br>procedureTForm1.FormCreate(Sender:TObject);<br>begin{搜寻表看是否程序已运行}<br>if GlobalFindAtom('PROGRAM_RUNNING')=0 then{如果没运行则在表中增加信息}<br> &nbsp; GlobalAddAtom('PROGRAM_RUNNING')<br>else <br>begin{如果程序已运行则显示信息然后退出}<br>MessageDlg('程序已运行!!',mtWarning,[mbOK],0);<br>Halt;<br>end;<br>end;<br><br>procedureTForm1.FormDestroy(Sender:TObject);<br>begin{从表中移走信息以便程序能再运行}<br>GlobalDeleteAtom(GlobalFindAtom('PROGRAM_RUNNING'));<br>end;<br><br>但这种方法在清空内存时就失效了。如果要永远只运行一次,最好动态生成一个ini文件程序运行时读取,读取有你设定的那个值就关闭程序!
 
接受答案了.
 
后退
顶部