Запуск Gui-приложения Через Сервис

Тема в разделе "Delphi - Система", создана пользователем Shouldercannon, 23 авг 2012.

  1. Shouldercannon

    Shouldercannon Well-Known Member

    Регистрация:
    25 май 2010
    Сообщения:
    125
    Симпатии:
    0
    Подскажите как через сервис запустить GUI-приложение.
    Код (Delphi):
    unit Unit1;

    interface

    uses
    Windows, Messages, SysUtils, Classes, Graphics, Controls, SvcMgr, Dialogs, ShellAPI;

    type
    TService1 = class(TService)
    procedure ServiceExecute(Sender: TService);
    procedure ServiceCreate(Sender: TObject);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    private
    { Private declarations }
    public
    function GetServiceController: TServiceController; override;
    { Public declarations }
    end;

    var
    Service1: TService1;

    implementation

    {$R *.DFM}

    procedure ServiceController(CtrlCode: DWord); stdcall;
    begin
    Service1.Controller(CtrlCode);
    end;

    function TService1.GetServiceController: TServiceController;
    begin
    Result := ServiceController;
    end;

    procedure TService1.ServiceCreate(Sender: TObject);
    begin
    //
    end;

    procedure TService1.ServiceExecute(Sender: TService);
    begin
    Sender.ReportStatus;
    end;

    procedure TService1.ServiceStart(Sender: TService; var Started: Boolean);
    begin
    ShellExecute(GetForegroundWindow, 'open', PChar(ExtractFilePath(ParamStr(0)) + 'Project1.exe'), nil, PChar('C:\'), SW_SHOWNORMAL);
    Started := False;
    end;

    end.
    Запускает программу, но её видно только в процессах.
     
  2. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    19
    В сервисе надо указать что ему разрешено работать с десктопом.

    Но это неправильно.
     
  3. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Ваш вопрос поставлен не корректно.
    В том виде как Вы его задали, ответ - никак (штатными средствами).
    Да, в Delphi 7 есть возможность включить эту опцию. Но реально работать это НЕ Будет...
    Дело в том что начиная с Windows Vista и во всех 64х битных версиях взаимодействие служб с рабочим столом (GUI) исключено.
    Да, это будет работать в ранних сборках WinXP, но на сколько я в курсе в SP3 эта ДЫРА БЕЗОПАСНОСТИ уже прикрыта.

    Кроме всего прочего необходимо учитывать что:
    1. Служба успешно стартует и работает (до/без) логона пользователя.
    2. В системе может быть несколько залогиненых рабочих столов (как с одним так и несколькими разными пользователями). В каком GUI (в этом случае) должен запуститься Ваш Project1.exe?

    Поэтому, в данной конкретной постановке, Ваш вопрос не имеет решения в лоб.
    но... всегда можно попытаться найти "обходные пути" либо альтернативное решение задачи...
    Например можно попробовать "пролезть" через сеть (системная команда NET START)...
    Или через Microsoft Task Scheduler API

    Например так

    Код (Delphi):
    {
    It executes these commands:

    schtasks /delete /f /tn "myjob"
    schtasks /create /tn "myjob" /tr "C:\Application.exe" /sc ONSTART /ru "System"

    /delete - delete the task
    /f - suppress the confirmation
    /create - create task parameter
    /tn - unique name of the task
    /tr - file name of an executable file
    /sc - schedule type, ONSTART - run at startup
    /ru - run task under permissions of the specified user

    }

    uses
    ShellAPI;

    //...

    // выполнить 'C:\Application.exe' при логоне пользователя
    procedure ScheduleRunAtStartup(const ATaskName: string; const AFileName: string; const GetPCName: string; Const GetPCUser: String);
    begin
    ShellExecute(0, nil, 'schtasks', PChar('/delete /f /tn "' + ATaskName + '"'), nil, SW_HIDE);
    ShellExecute(0, nil, 'schtasks', PChar('/create /tn "' + ATaskName + '" ' + '/tr "' + QuotedStr(AFileName) + '" /sc ONLOGON /ru "' + GetPCName+'\'+GetPCUser + '"'), nil, SW_HIDE)
    end;
    Или как нибудь по другому... Если Вы задачу по конкретнее сформулируете... ;)
     
  4. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    19
    Где такое написано?
     
  5. Shouldercannon

    Shouldercannon Well-Known Member

    Регистрация:
    25 май 2010
    Сообщения:
    125
    Симпатии:
    0
    Хочу реализовать запуск своей программы как это делает TeamViewer или VipNet для Windows Server 2008 R2 x64.
     
  6. -master-

    -master- Well-Known Member

    Регистрация:
    14 янв 2012
    Сообщения:
    629
    Симпатии:
    19
    ну так и при чкм тут сервисы?
     
  7. sinkopa

    sinkopa Well-Known Member

    Регистрация:
    17 июн 2009
    Сообщения:
    344
    Симпатии:
    9
    Полностью поддерживаю. Служба Вас "не спасёт".
    Вам нужен (как минимум) приложение-агент запускающийся в окружении залогиненого пользователя или даже сервер со специальным клиентом (в зависимости от задачи)...

    В MSDN конечно же... ;) http://msdn.microsoft.com/en-us/library/ms683502(VS.85).aspx
    Там же кстати, изложены доступные ныне методы интерактивного взаимодействия служб и рабочего стола пользователя...
     
Загрузка...

Поделиться этой страницей