服务器远程多用户登录后,由于我的程序是自动启动的,在不同用户远程登录后,该程序就会被运行多次,
有没有办法我只要运行一次,而且每个用户下面都可以对该程序进行操作(非服务模式)。就像大多杀毒软件那样
好像不管多少个用户,实例都只运行了一次

解决方案 »

  1.   

    即加Global\前缀,应该是可以的
      

  2.   

    跨用户、跨权限的全局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.
      

  3.   

    给你个例子,我自己用的,放到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.