Дважды щелкните на исполняемом файле службы Windows для настройки - PullRequest
0 голосов
/ 11 декабря 2018

Я написал приложение службы Windows Delphi Win32 из шаблона Delphi IDE, и оно работает очень хорошо при установке и запуске из панели управления службами.

Теперь я хотел бы написать приложение для настройки и подумалвозможно, это может быть конфигуратор для себя, если просто дважды щелкнуть по его исполняемому файлу.

Я так думаю, потому что при двойном щелчке служба каким-то образом различает, что она не была выполнена системой управления службами.

Итак, вот мои вопросы:

  1. Как приложение-служба различает простой запуск и запуск в качестве службы?
  2. Можно ли использовать простой запуск для выполнения некоторых действий?кроме режима обслуживания?Будет ли это мешать работе в сервисном режиме?

1 Ответ

0 голосов
/ 11 декабря 2018

для ответа на ваши вопросы:

Как приложение-служба различает простой запуск и запуск в качестве службы?

посмотрите на код, стоящий за TServiceApplication.CreateForm в единице Vcl.SVcMgr

Может ли простой прогон использоваться для выполнения каких-либо действий, кроме режима обслуживания?

Да, см.ответ ниже

Будет ли это мешать работе в сервисном режиме?

Нет

Все, что вам нужно сделатьэто изменить исходный код службы (файл .dpr) на что-то вроде этого:

 begin
  if FindCmdLineSwitch('config', ['-', '/'], True) then
   TMyForm.Run
  else
   begin
    if not Application.DelayInitialize or Application.Installing then
     Application.Initialize;
    Application.CreateForm(TSvc_MyService, Svc_MyService);
    Application.Run;
   end;
end.

, где TMyForm.Run определяется как процедура класса в моей основной форме графического интерфейса:

class procedure TMyForm.Run;
begin
 TThread.NameThreadForDebugging('FormRunner');
 ReportMemoryLeaksOnShutdown := DebugHook <> 0;
 Forms.Application.Initialize;
 Forms.Application.ShowMainForm := True;
 Forms.Application.MainFormOnTaskBar := True;
 Forms.Application.CreateForm(TMyForm, MyForm);
 Forms.Application.Run;
end;

Поэтому, когда вы запускаете исполняемый файл службы с флагом / config (или -config), он запускается как обычное приложение форм.

Обновление

Различие более вероятнодолжно быть сделано здесь:

procedure TServiceStartThread.Execute;
begin
  if StartServiceCtrlDispatcher(FServiceStartTable[0]) then
    ReturnValue := 0
  else
    ReturnValue := GetLastError; //Code 1063 if started like an app
end;

Это приводит к тому, что сообщение WM_QUIT будет отправлено в очередь сообщений.

Следующий цикл завершается при полученииes WM_QUIT message.

procedure TServiceApplication.Run;
.....
begin
  .....
  while not Vcl.Forms.Application.Terminated do
  try
    Vcl.Forms.Application.HandleMessage;
  except
    on E: Exception do
      DoHandleException(E);
  end;
  .....
end;

Более подробная информация по теме здесь:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...