禁止同时运行两个相同的程序.(10分)

  • 主题发起人 主题发起人 leader47
  • 开始时间 开始时间
L

leader47

Unregistered / Unconfirmed
GUEST, unregistred user!
怎么样禁止相同的两个程序同时运行两次?
即,已在运行的程序,在没有关闭前不能再运行.
 
放到你的程序的DRR里或者主窗体的initialization部分。
var
hMutex: HWND;
Ret: Integer;
begin
Application.Title := '你的程序名称;
hMutex := CreateMutex(nil, False, '你的程序名称');
Ret := GetLastError;
if Ret <> ERROR_ALREADY_EXISTS then
begin
Application.Initialize;
// 你创建的一些窗口
end
else
begin
SysUtils.beep;
MessageBox(0, '已运行!', '提示!', MB_ICONERROR);
end;
ReleaseMutex(hMutex)
end.
 
在工程文件中加入
DeskMutex:=CreateMutex(nil, True, '一段文字用于标识你的执行文件');
try
if GetLastError = ERROR_ALREADY_EXISTS then
begin
showmessage('已经启动了XXX.');
CloseDeskMutex;
Halt;
end;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
finally
CloseDeskMutex;
end;
 
楼主忘记了DFW还有搜索功能?
 
DFW ? 不懂.
可以解析一下吗?
 
二楼的,我试过了,还有个问题.
在主窗体的 FormCreate 里加了那段代码,运行第二次的时候,能够运行到MessageBox(0, '已运行!', '提示!', MB_ICONERROR);弹出对话框.
但,接着不停地弹出同一个错误:Access violation at address 004d805d in module 'project1.exe'. Read of address 00000005c.
请问这是什么错误?是不是我的代码本来有错?
 
应该放在工程文件里 而不是主窗体的Create中
 
在工程文件中加入


var
Rvhandle:Hwnd;

{$R *.RES}

begin
RvHandle := FindWindow(nil,'XXXXX'); //XXXX是你的程序Title
if RvHandle > 0 then
begin
if IsIconic(Rvhandle) = TRUE then
begin
showwindow(Rvhandle,1);
end
else
begin
SetForegroundWindow(RvHandle);
end;

Exit;
end;
 
在工程文件中加入


var
Rvhandle:Hwnd;

{$R *.RES}

begin
RvHandle := FindWindow(nil,'XXXXX'); //XXXX是你的程序Title
if RvHandle > 0 then
begin
Application.Terminate;
Exit;
end;
 
谢谢各位 ,先来者得分.
 
后退
顶部