AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Beliebiges Programm als Service?
Thema durchsuchen
Ansicht
Themen-Optionen

Beliebiges Programm als Service?

Ein Thema von quirks · begonnen am 27. Dez 2004 · letzter Beitrag vom 6. Mär 2012
Antwort Antwort
jensw_2000
(Gast)

n/a Beiträge
 
#1

Re: Beliebiges Programm als Service?

  Alt 27. Dez 2004, 22:22
Aber der Invoker ist kostenlos und funktioniert super...

Schöne Grüße,
Jens

  Mit Zitat antworten Zitat
Benutzerbild von ralfiii
ralfiii

Registriert seit: 30. Mai 2007
490 Beiträge
 
Delphi 2010 Professional
 
#2

AW: Re: Beliebiges Programm als Service?

  Alt 13. Feb 2012, 12:36
...ist lange her, ich werd den Thread mal wiederbeleben.
Ich brauche eben das: Ein Programm als Dienst laufen lassen.

Ich hab hier von sc.exe gelesen.
Ich hab nun eine 1-Formular-Mini-Applikation (In OnCreate erzeugt sie ein File, in onDestroy ein anderes) gemacht und mal als Dienst registriert.

Click ich in der Dienste-Fenster auf "Dienst starten", dann läuft der Progressbar eine Zeit lang, OnCreate wird offensichtlich ausgeführt, dann aber hängt der Progrssbar lang bei ca. 50% und dann kommt

"Der Dienst "Test" auf "Lokaler Computer" konnte nicht gestartet werden.
Fehler 1053: Der Dienst antwortete nicht rechtzeitig auf die Start- oder Steuerungsanforderung."

Hat jemand eine Idee?
Danke!
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.784 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Beliebiges Programm als Service?

  Alt 13. Feb 2012, 12:46
.. soweit ich weiß sind interaktive Services seit Windows XP nicht mehr gestattet.

Einen richtigen Serivice zu bauen ist mit Delphi auch kein Hexenwerk.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.054 Beiträge
 
Delphi 12 Athens
 
#4

AW: Beliebiges Programm als Service?

  Alt 13. Feb 2012, 13:04
Um genau zu sein waren interaktive Dienste schon immer nur eine Notlösung, konnten aber bis XP dennoch aktiviert werden. Seit Vista ist diese extreme Sicherheitslücke endlich komplett gestopft, indem interaktive Dienste gar nicht mehr erlaubt sind.

Ich hab nun eine 1-Formular-Mini-Applikation (In OnCreate erzeugt sie ein File, in onDestroy ein anderes)
Und was daran braucht da ein Formular?
In einer Serviceanwendung kannst du einfach das Start- und Ende-Event des Dienstes benutzen und fertig. Schau einfach mal in die Liste der Events, wenn du eine Serviceanwendung in Delphi erstellt hast.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von ralfiii
ralfiii

Registriert seit: 30. Mai 2007
490 Beiträge
 
Delphi 2010 Professional
 
#5

AW: Beliebiges Programm als Service?

  Alt 13. Feb 2012, 16:12
Ich hab nun eine 1-Formular-Mini-Applikation (In OnCreate erzeugt sie ein File, in onDestroy ein anderes)
Und was daran braucht da ein Formular?
Ich brauch das Formular natürlich nicht, das war nur zum Testen.
Es geht hier um eine Installation einer alten Version unserer Software.
Da gab's ein Tool, das (nicht sonderlich smart) im Autostart aufgerufen wurde und sich dann in der Taskleiste eingenistet hat.
In der aktuellen Version der Software ist dieses Tool bereits ein Service, ich will dem Kunden aber nicht die neue Version installieren müssen.

Daher wollte ich die alte Anwendung (die ein Fenster hat, das aber nicht sichtbar zu sein braucht) als Service starten.

Heisst das, dass man mit cs.exe nur Anwendungen ohne WinHandles als Dienst starten kann?
Oder warum kommt diese Fehlermeldung?

Danke
  Mit Zitat antworten Zitat
Benutzerbild von joachimd
joachimd

Registriert seit: 17. Feb 2005
Ort: Weitingen
685 Beiträge
 
Delphi 12 Athens
 
#6

AW: Beliebiges Programm als Service?

  Alt 13. Feb 2012, 16:16
Ich brauch das Formular natürlich nicht, das war nur zum Testen.
Cary Jensen hat mal in einem (oder mehreren) Vortrag zur Dienste-Entwicklung einen netten Trick gezeigt: Du baust die komplette Funktionalität in ein Daten-Modul. Zum Test kannst Du eine VCL-Forms-App erzeugen, die das Datenmodul erzeugt und Ausgaben visualisiert ... als Service baust du eine Service-Anwendung, die das Datenmodul nur erzeugt und automatisch rennen lässt.
Joachim Dürr
Joachim Dürr Softwareengineering
http://www.jd-engineering.de
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
10.054 Beiträge
 
Delphi 12 Athens
 
#7

AW: Beliebiges Programm als Service?

  Alt 13. Feb 2012, 16:26
Ich mache das in einer Anwendung, die man als Dienst installieren und verwenden kann, aber auch normal starten.
Stichworte: schauen, ob die Exe von der services.exe gestartet wird, ob sie /install oder /uninstall als Parameter hat, dann entweder TServiceApplication oder TApplication, ...
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Benutzerbild von ralfiii
ralfiii

Registriert seit: 30. Mai 2007
490 Beiträge
 
Delphi 2010 Professional
 
#8

AW: Beliebiges Programm als Service?

  Alt 13. Feb 2012, 16:33
Cary Jensen hat mal in einem (oder mehreren) Vortrag zur Dienste-Entwicklung einen netten Trick gezeigt: Du baust die komplette Funktionalität in ein Daten-Modul.
So ähnlich ist das in der aktuellen Version der Software gelöst - da ist alles in einem Handler-Objekt verpackt.
Aber für diesen Kunden MUSS es die alte Version sein.
Und bei der möchte ich die Sourcen möglichst unangetastet lassen.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Beliebiges Programm als Service?

  Alt 13. Feb 2012, 16:40
Oder andersrum.

Man baut einen Service, welcher sich (über einen Parameter, bzw. über eine Debugger-Erkennung) als normales Programm startet.
So hab ich das mit dem Service unsere unserer Produktes auch gehandhabt.

[edit]
Delphi-Quellcode:
unit MyServiceDataModul;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, SvcMgr, Math, AppEvnts, Registry, Dialogs, ExtCtrls, Types, StdCtrls;

type
  TMyService = class(TService)
    function GetServiceController: TServiceController; override;
    procedure ServiceCreate(Sender: TObject);
    procedure ServiceStart(Sender: TService; var Started: Boolean);
    procedure ServiceExecute(Sender: TService);
    procedure DebugServiceClose(Sender: TObject; var CanClose: Boolean);
  end;

var
  MyService: TMyService;

implementation

{$R *.DFM}

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

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

type
  TServiceApplicationHack = class(TServiceApplication);

procedure TMyService.ServiceCreate(Sender: TObject);
var
  Started: Boolean;
  Temp: TForm;
begin
  if IsDebuggerPresent or FindCmdLineSwitch('DEBUG', ['-', '/'], True) then begin
    Forms.Application.MainFormOnTaskBar := False; // geht leider doch nicht ohne Form
    Forms.Application.CreateForm(TForm, Temp); // Form zum Beenden und für Eintrag in Taskbar
    Temp.Caption := 'Debug-Mode: ' + SvcMgr.Application.Title;
    Temp.OnCloseQuery := DebugServiceClose;
    Temp.Visible := True;
    { SvcMgr.Application.Run; }
    {}if FindCmdLineSwitch('INSTALL', ['-', '/'], True) then
    {}  TServiceApplicationHack(Application).RegisterServices(True, FindCmdLineSwitch('SILENT', ['-', '/'], True))
    {}else if FindCmdLineSwitch('UNINSTALL', ['-', '/'], True) then
    {}  TServiceApplicationHack(Application).RegisterServices(False, FindCmdLineSwitch('SILENT', ['-', '/'], True))
    {}else begin
    {}  Started := True;
    {}  ServiceStart(Self, Started);
    {}  if Started then
    {}    while not Terminated do begin
    {}      Forms.Application.ProcessMessages;
    {}      Sleep(20);
    {}    end;
    {}  Forms.Application.Terminate;
    {}end;
  end;
end;

procedure TMyService.ServiceStart(Sender: TService; var Started: Boolean);
begin
  try

    ...

  except
    on E: Exception do begin
      Started := False;
      ErrCode := 666;
      E.Message := 'Service konnte nicht gestartet werden.' + sLineBreak + E.Message;
      raise;
    end;
  end;
end;

procedure TMyService.ServiceExecute(Sender: TService);
begin
  while not Terminated do
    try
      ServiceThread.ProcessRequests(False);
    except
      on E: Exception do begin
        LogEvent('Es ist ein nicht abgefangener Fehler aufgetreten.', E);
        Sleep(500);
      end;
    end;
end;

procedure TMyService.DebugServiceClose(Sender: TObject; var CanClose: Boolean);
begin
  if Assigned(MyService) and Assigned(MyService.ServiceThread) then
    MyService.ServiceThread.Terminate;
end;

end.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (13. Feb 2012 um 16:54 Uhr)
  Mit Zitat antworten Zitat
tinof

Registriert seit: 16. Sep 2009
Ort: Kirchberg / Sa.
12 Beiträge
 
Delphi 2009 Professional
 
#10

AW: Beliebiges Programm als Service?

  Alt 13. Feb 2012, 13:07
Ich habe gute Erfahrungen mit dem -kostenpflichtigen, aber erschwinglichen- Programm "Application As Service" gemacht.

Das ist gut geeignet, um eine Desktop - Anwendung mal schnell als Service auszuführen. Natürlich muß diese automatisch 'laufen', Benutzerinteraktionen können nur beim Start und Beenden des "Services" mitgegeben werden.

Grüße
Tino
Ich hab's gleich!

... sagte der Programmierer
  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 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