Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   WindowsService und FMX geht das? (https://www.delphipraxis.net/216295-windowsservice-und-fmx-geht-das.html)

QuickAndDirty 5. Dez 2024 15:16

WindowsService und FMX geht das?
 
Ich habe in meinen Services einen Startparameter SERVICE dann startet die Exe als Dienst...das wirde beim installieren in der Registry angepasst.
Andernfalls startet die Exe als Fensteranwednung.

Delphi-Quellcode:
//in AfterInstall aufrufen von TService aufrufen
Procedure AddServiceStartParamToRegistry(ServiceName:String);
var
  reg:TRegistry;
begin
  reg := TRegistry.Create;
  try
    reg.RootKey := HKEY_LOCAL_MACHINE;
    if reg.OpenKey('SYSTEM\CurrentControlSet\Services\'+ServiceName, True) then
    begin
      reg.WriteString('ImagePath', ParamStr(0) + ' /SERVICE ');
      reg.CloseKey;
    end;
  finally
    reg.Free;
  end;
End;

Function CheckWindowedRun:Boolean;
Begin
  Result := (
              FindCmdLineSwitch('APP', ['/','-'],true)
            )
            or
            (
              not FindCmdLineSwitch('INSTALL',['/','-'],true) and
              not FindCmdLineSwitch('UNINSTALL',['/','-'],true) and
              not FindCmdLineSwitch('SERVICE',['/','-'],true)
            );
end;

Procedure RunWindowed(InstanceClass: TComponentClass; var Reference);
Begin
  if CheckWindowedRun then
  Begin
    Vcl.Forms.Application.Initialize;
    Vcl.Forms.Application.CreateForm(InstanceClass, Reference);
    Vcl.Forms.Application.Run;
    Halt(0);
  End
End;
Delphi-Quellcode:
programm MY_Programm;
uses
  Vcl.SvcMgr,
  Web.WebReq,
  uMyGUIFrm,
  (*
   etc. etc.
   *)
   ;
begin
  Randomize;

  if WebRequestHandler <> nil then
    WebRequestHandler.WebModuleClass := WebModuleClass;

  //Ab jetzt kommt das Anwendungsframework
  RunWindowed(uMyGUIFrm.TMyGUI, uMyGUIFrm.MyGui);

  if not Application.DelayInitialize or Application.Installing then
    Application.Initialize;
  Application.CreateForm(TMy_Service, My_Service);
  Application.Run;
end.
Es waren aber immer VCL Fenster.
Ich würde das ganze auch mit FMX Fenstern machen.
Geht das?

Sherlock 5. Dez 2024 16:11

AW: WindowsService und FMX geht das?
 
Das sollte doch schnell auszuprobieren sein.

himitsu 5. Dez 2024 16:16

AW: WindowsService und FMX geht das?
 
Erstmal ist es sowieso möglich FMX und VCL zu mischen
und dann läuft in deinem Fall doch eh nicht Beides gleichzeitig, also egal.

TService baut ja auf der VCL auf, aber normal bekommst du davon nix mit.



Warum Halt?
Wieso den Code nicht direkt im DPR-Maincode, bzw. warum nicht einen Boolean-Result und bei False den nachfolgenden Code überspringen?




PS: ServiceApplication.Run beendet sich ja sofort wieder, wenn die Service-Anwendung nicht als Service gestartet wurde.
Drum hab ich mir den Code vom Run nachgebaut und wenn Parameter -DEBUG, erstelle ich ein DummyFenster mit einem Beendenknopf
und führe dann den Code meines TService-Klasse aus, um so sen Service einfach debuggen zu können (-DEBUG in den Startparametern des Projekts)

Man könnte aber auch zusätzlich/stattdessen auf MSDN-Library durchsuchenIsDebuggerPresent prüfen.

QuickAndDirty 5. Dez 2024 17:01

AW: WindowsService und FMX geht das?
 
Zitat:

Zitat von himitsu (Beitrag 1543931)
Erstmal ist es sowieso möglich FMX und VCL zu mischen
und dann läuft in deinem Fall doch eh nicht Beides gleichzeitig, also egal.

Sehr gut. Das wusste ich nicht das man das problemlos mischen kann.

Zitat:

Zitat von himitsu (Beitrag 1543931)
TService baut ja auf der VCL auf, aber normal bekommst du davon nix mit.

Ja ich weiß.

Zitat:

Zitat von himitsu (Beitrag 1543931)
Warum Halt?

Der Code ist alt.. wollte damals bestimmt doppelt und dreifach sicher gehen das es nicht mehr weitergeht. Habe aber keine Erklärung warum.

Zitat:

Zitat von himitsu (Beitrag 1543931)
Wieso den Code nicht direkt im DPR-Maincode, bzw. warum nicht einen Boolean-Result und bei False den nachfolgenden Code überspringen?

Ich verwende das recht häufig. Und so wiederhole ich mich nicht so oft...


Zitat:

Zitat von himitsu (Beitrag 1543931)
PS: ServiceApplication.Run beendet sich ja sofort wieder, wenn die Service-Anwendung nicht als Service gestartet wurde.
Drum hab ich mir den Code vom Run nachgebaut und wenn Parameter -DEBUG, erstelle ich ein DummyFenster mit einem Beendenknopf
und führe dann den Code meines TService-Klasse aus, um so sen Service einfach debuggen zu können (-DEBUG in den Startparametern des Projekts)

Man könnte aber auch zusätzlich/stattdessen auf MSDN-Library durchsuchenIsDebuggerPresent prüfen.

Interessant. Ich benutzte die "Fenster" Anwendung um den Dienst (selbe exe) zu starten/stoppen/Installieren/Deinstallieren/Settings zu ändern...Oder um die Geschäftslogik unabhängig vom Servicemanager auszuführen.
Das hilft auch beim debuggen.
Und ich erspare mir Setups und der Support muss dann nicht erst in den ServiceManager um nachzusehen ob der Dienst da ist und dann in die Konsole um den Dienst zu installieren,...


Muss ich Einen Windows Dienst erstellen und dann ein FMX Fenster hinzufügen ?
Muss ich evtl die "Projektoptionen->Delphi-Compiler->Unit-Gültigkeitsbereichsnamen" aus einem FMX projekt kopieren? Oder immer alles voll qualifiziert nutzen?

Ich benutze diese "UserTools.proj"
Code:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    <DCC_Define>FrameWork_$(FrameworkType);$(DCC_Define)</DCC_Define>
  </PropertyGroup>
</Project>
Damit ich mit {$IFDEF Framework_FMX} oder {$IFDEF Framework_VCL} arbeiten kann.

Damit das korrekt gesetzt wird muss ich
Muss ich vermutlich erst das FMX Projekt starten und dann den Dienst Code im Projekt nachtragen oder?
Oder kann ich "FrameworkType" irgendwo in der IDE in den Projektoptionen ändern?


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:40 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz