AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

WindowsService und FMX geht das?

Ein Thema von QuickAndDirty · begonnen am 5. Dez 2024 · letzter Beitrag vom 5. Dez 2024
Antwort Antwort
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#1

WindowsService und FMX geht das?

  Alt 5. Dez 2024, 16:16
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?
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty ( 5. Dez 2024 um 16:35 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.800 Beiträge
 
Delphi 12 Athens
 
#2

AW: WindowsService und FMX geht das?

  Alt 5. Dez 2024, 17:11
Das sollte doch schnell auszuprobieren sein.
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

AW: WindowsService und FMX geht das?

  Alt 5. Dez 2024, 17:16
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.
$2B or not $2B

Geändert von himitsu ( 5. Dez 2024 um 17:23 Uhr)
  Mit Zitat antworten Zitat
QuickAndDirty

Registriert seit: 13. Jan 2004
Ort: Hamm(Westf)
1.944 Beiträge
 
Delphi 12 Athens
 
#4

AW: WindowsService und FMX geht das?

  Alt 5. Dez 2024, 18:01
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.

TService baut ja auf der VCL auf, aber normal bekommst du davon nix mit.
Ja ich weiß.

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

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...


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?
Andreas
Monads? Wtf are Monads?

Geändert von QuickAndDirty ( 5. Dez 2024 um 18:13 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:09 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz