跨用户、跨权限的全局Mutex限制程序只运行一个如何限制系统服务和桌面程序只运行一个在工程加入下列代码可以设置系统服务和桌面程序只运行一个。 program FleetReportSvr;uses SvcMgr, Forms, SysUtils, Windows, SvrMain in 'SvrMain.pas' {FleetReportService: TService}, AppMain in 'AppMain.pas' {FmFleetReport};{$R *.RES}const CSMutexName = 'Global\Services_Application_Mutex'; var OneInstanceMutex: THandle; SecMem: SECURITY_ATTRIBUTES; aSD: SECURITY_DESCRIPTOR; begin InitializeSecurityDescriptor(@aSD, SECURITY_DESCRIPTOR_REVISION); SetSecurityDescriptorDacl(@aSD, True, nil, False); SecMem.nLength := SizeOf(SECURITY_ATTRIBUTES); SecMem.lpSecurityDescriptor := @aSD; SecMem.bInheritHandle := False; OneInstanceMutex := CreateMutex(@SecMem, False, CSMutexName); if (GetLastError = ERROR_ALREADY_EXISTS)then begin DlgError('Error, Program or service already running!'); Exit; end; if FindCmdLineSwitch('svc', True) or FindCmdLineSwitch('install', True) or FindCmdLineSwitch('uninstall', True) then begin SvcMgr.Application.Initialize; SvcMgr.Application.CreateForm(TSvSvrMain, SvSvrMain); SvcMgr.Application.Run; end else begin Forms.Application.Initialize; Forms.Application.CreateForm(TFmFmMain, FmMain); Forms.Application.Run; end; end.
给你个例子,我自己用的,放到dpr文件里 var mHandle:THandle; PreviousInstanceWindow:HWnd; Project:PChar;//String; AppName:String; begin Application.Initialize; Project:='RunOnlyOnce_ControlClient-new'; Application.Title := '客户端; mHandle:=CreateMutex(nil,True,PChar(Project)); if GetLastError=ERROR_ALREADY_EXISTS then begin AppName:='客户端'; Application.ShowMainForm:=False; PreviousInstanceWindow:=FindWindow(nil,PChar(AppName)); if PreviousInstanceWindow<>0 then if IsIconic(PreviousInstanceWindow) then ShowWindow(PreviousInstanceWindow,SW_RESTORE) else SetForegroundWindow(PreviousInstanceWindow); Application.Terminate; end; Application.CreateForm(TLoginForm, LoginForm); Application.Run; end.
program FleetReportSvr;uses
SvcMgr,
Forms,
SysUtils,
Windows,
SvrMain in 'SvrMain.pas' {FleetReportService: TService},
AppMain in 'AppMain.pas' {FmFleetReport};{$R *.RES}const
CSMutexName = 'Global\Services_Application_Mutex';
var
OneInstanceMutex: THandle;
SecMem: SECURITY_ATTRIBUTES;
aSD: SECURITY_DESCRIPTOR;
begin
InitializeSecurityDescriptor(@aSD, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(@aSD, True, nil, False);
SecMem.nLength := SizeOf(SECURITY_ATTRIBUTES);
SecMem.lpSecurityDescriptor := @aSD;
SecMem.bInheritHandle := False;
OneInstanceMutex := CreateMutex(@SecMem, False, CSMutexName);
if (GetLastError = ERROR_ALREADY_EXISTS)then
begin
DlgError('Error, Program or service already running!');
Exit;
end;
if FindCmdLineSwitch('svc', True) or
FindCmdLineSwitch('install', True) or
FindCmdLineSwitch('uninstall', True) then
begin
SvcMgr.Application.Initialize;
SvcMgr.Application.CreateForm(TSvSvrMain, SvSvrMain);
SvcMgr.Application.Run;
end
else
begin
Forms.Application.Initialize;
Forms.Application.CreateForm(TFmFmMain, FmMain);
Forms.Application.Run;
end;
end.
var
mHandle:THandle;
PreviousInstanceWindow:HWnd;
Project:PChar;//String;
AppName:String;
begin
Application.Initialize;
Project:='RunOnlyOnce_ControlClient-new';
Application.Title := '客户端;
mHandle:=CreateMutex(nil,True,PChar(Project));
if GetLastError=ERROR_ALREADY_EXISTS then
begin
AppName:='客户端';
Application.ShowMainForm:=False;
PreviousInstanceWindow:=FindWindow(nil,PChar(AppName));
if PreviousInstanceWindow<>0 then
if IsIconic(PreviousInstanceWindow) then
ShowWindow(PreviousInstanceWindow,SW_RESTORE)
else
SetForegroundWindow(PreviousInstanceWindow);
Application.Terminate;
end;
Application.CreateForm(TLoginForm, LoginForm);
Application.Run;
end.