для ответа на ваши вопросы:
Как приложение-служба различает простой запуск и запуск в качестве службы?
посмотрите на код, стоящий за 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;
Более подробная информация по теме здесь: