如何防止程序重复执行(50分)

  • 主题发起人 主题发起人 GWW
  • 开始时间 开始时间
G

GWW

Unregistered / Unconfirmed
GUEST, unregistred user!
如何防止一个程序运行未关闭时,又被重复运行。
 
这个很简单吗,在程序开始时查找一个你自己的程序,用findwindow,如果找到,就中止运行。
 
参见这个贴子:
http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=142451
 
使用全局原子://声明一下,下面代码的原作者是:王靖;
program Pvdde;
uses
Forms,shellapi,Windows,dialogs,dde in 'dde.pas' {Form1};
{$R *.RES}
begin
if GlobalFindAtom(PChar('PDDE_IS_RUNNING')) = 0 then
//避免二次启动
begin
K:=GlobalAddAtom(PChar('PDDE_IS_RUNNING'));
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end
else
begin
//传递二次启动时的参数到第一个实例
H := FindWindow(PChar('TForm1'), PChar('资料保密 严禁外传'));
if ParamCount > 0 then
begin
L := GlobalAddAtom(PChar(ParamStr(1)));
if H<>0 then
SendMessage(H, WM_MYMESSAGE, 0, L);
{ 传递原子句柄 }
GlobalDeleteAtom(L); { 使用后释放 }
end;
Application.Terminate;
end;
end.

在相应的窗口单元dde.pas增加对自定义消息WM_MYMESSAGE的处理:
procedure TForm1.MyMessage(var T:TMessage);
{对 WM_MYMESSAGE消息进行处理 }
var
P:Array [0..255] of char;
begin
GlobalGetAtomName(T.LParam, P,255); { 接受数据到p数组中 }
。。。
end;
 
在项目文件.dpr中用findwindow函数就可以了
 
还有一种方法您不妨试试我也是看来的
这只要在.DPR文件中加上
if hPrevInst = 0 then
begin
{ 检查没有再调用}
Application.CreateForm(MyForm, MyForm);
Application.Run;
end;
 
这个问题还没结束?
hPrevInst这个参数是16位编程中用的32位中已经不检测这个参数了。
在Application.Initialize
之前用FindWindow(类名,窗口名)//写一个参数即可
判断一下如果返回值不为空退出即可。
 
多人接受答案了。
 
后退
顶部