to aqtata:A程序只能打开一次,是在A程序中做的互斥。 服务只是调用winexec或者createprocess方法启动A程序,这样也与CreateMutex的第一个参数有关吗?
因为没有源码,不过9楼说的也是有可能的,如果是这样原因,那么解决办法是很简单的: h := OpenMutex(READ_CONTROL, FALSE, pansichar('mymutex')); //注意一定要使用READ_CONTROL if h <> 0 then 程序的另外一个示例已经打开了,直接退出 else createMultex(...)
Windows, Forms,
Unit1 in 'Unit1.pas' {Form1};{$R *.RES}begin
Application.Initialize; Application.Title:='我的测试程序';
CreateMutex(nil,False,'我的测试程序');
if (GetLastError()=ERROR_ALREADY_EXISTS) then
begin
Application.MessageBox(PChar('当前程序只能且只有一个实例运行'), '错误信息:', MB_ICONERROR);
exit;
end;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
的标题信息,可能修改成你想要“信息”
不过
CreateMutex(nil,False,'信息');
必须与上样一致的
是这样吗?可结果还是一样,OpenNum返回的是0
const
NameMutex = 'Global\\SingleApp'; OpenNum := OpenMutex(MUTEX_ALL_ACCESS, False, NameMutex);
to sgzhou12345:
这个方法不行,如果只双击打开应该是没问题,不过先用服务打开,再双击还是能打开的。感谢大家的回复!
我觉得应该是服务的问题,我用winexec和createprocess方法都试过,都不行!
服务只是调用winexec或者createprocess方法启动A程序,这样也与CreateMutex的第一个参数有关吗?
因为没有源码,不过9楼说的也是有可能的,如果是这样原因,那么解决办法是很简单的:
h := OpenMutex(READ_CONTROL, FALSE, pansichar('mymutex')); //注意一定要使用READ_CONTROL
if h <> 0 then
程序的另外一个示例已经打开了,直接退出
else
createMultex(...)