防止一个程序被第二次运行(20分)

  • 主题发起人 主题发起人 nter
  • 开始时间 开始时间
N

nter

Unregistered / Unconfirmed
GUEST, unregistred user!
怎样防止一个程序被第二次运行?
 
copy<br><br>检测程序是否运行<br><br>  在某些情况下,我们编写的应用程序同时只能有一个实例在内存中运行,<br>例如服务器程序、需要独占某设备的程序,甚至我们仅仅是让程序同时只有<br>一个实例运行(如UltraEdit就是这样做的,让你不能同时运行多个UltraEdit)。<br>要实现此功能,需要在程序中加一点判断的代码,在Windows 95或Win32环境下<br>的Delphi版本中实现的程序如下:<br>按Ctrl+F12键,选择Project1,加入下列语句<br>program Project1;<br><br>uses<br>windows, {加入该句才能调用函数}<br>Forms,<br>Unit1 in 'Unit1.pas'{Form1};<br><br>{$R *.RES}<br>const classname='TForm1'; {声明为主窗体的类名}<br>var handle:integer; {变量}<br><br>begin<br>{-----------------主要为该判断部分----------------------}<br>handle:=findwindow(classname,nil);{查找是否有此类的窗体}<br>if handle&lt;&gt;0 then {不为0则程序已运行}<br>begin<br>messagebox(0,'该程序已经有一个在运行中!','运行',0);{提示程序已运行}<br>halt; {退出程序}<br>end;<br>{------------------------------------------------------}<br>Application.Initialize;<br>Application.CreateForm(TForm1, Form1);<br>Application.Run;<br>end.<br>  该程序在测试时由于Delphi也生成了此类实例窗体,所以会出现提示框,<br>只有关闭Delphi后单独运行程序才能实现。<br><br>  <br>
 
真快,,,!!!
 
其实还有一种方法,我觉的比较科学一些;就是产生互斥量,其调用的方法为:<br>HANDLE CreateMutex(<br>&nbsp; LPSECURITY_ATTRIBUTES lpMutexAttributes,<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// pointer to security attributes<br>&nbsp; BOOL bInitialOwner, &nbsp;// flag for initial ownership<br>&nbsp; LPCTSTR lpName &nbsp; &nbsp; &nbsp; // pointer to mutex-object name<br>);<br><br>以上说明为msdn中的说明;<br>程序一开始先调用此函数,通过访问错误值,如果错误值说明互斥量已产生,表明<br>程序已经运行,那么关闭此程序;<br>最后说一句,程序正常关闭时,别忘释放互斥量,函数如下:<br>BOOL ReleaseMutex(<br>&nbsp; HANDLE hMutex &nbsp; // handle to mutex object<br>);<br><br>详情查阅msdn.^o^<br><br>&nbsp;
 
其实还有很多方法,<br>比如用 FileMap, GlobalAtom, 甚至用 Registry, IniFile <br>任何可做标记的东西。
 
还有用CreateToolhelpSnapshot32 &nbsp;api
 
用FindWindow比较容易实现,另外你还可以用Windows的回调函数:EnumWindows和<br>EnumChildWindows实现,看能否找到具有某个特征的窗体.
 
接受答案了.
 
后退
顶部