Windows-Service / Applikation : Unterscheidung Startart (System / Konsole)
-
Hallo,
ich habe hier ein C-Programm (srvdemo.exe, geschrieben mit GCC / G++
unter Eclipse), das sich selbst als Windows-Service installieren, als
Service laufen und sich auch wieder als Service deinstallieren kann.Jetzt bräuchte ich noch eine Möglichkeit, wie das Programm / der Service
gleich am Anfang erkennen kann, ob es / er von der Konsole
("DOS-Fenster") oder vom Windows-System aus gestartet worden ist.Wenn Kommandozeilenparameter angegeben sind, ist das ja kein Problem,
die kann man ja z.B. mit "lpCmdLine" auswerten und in diesem Fall ist
der Start von der Konsole aus erfolgt.
Aber wie geht das, wenn das Programm / der Dienst ohne
Kommandozeilenparameter gestartet worden sind ?Der Programmstart erfolgt mit "int WINAPI WinMain()", nicht mit "main()"
-
-
- Es gibt einen Unterschied zwischen C++ und C, mit C bist du hier am falschen Ort.
- Standard-C++ kennt kein Windows, keine Konsole, kein lpCmdLine, kein WINAPI und kein WinMain.
- Wenn man neu in einem Forum ist, liest man sich vor dem Posten erstmal die mit wichtig markierten Threads durch, weil solche Fragen da schon beantwortet sein könnten bzw. es Hinweise geben kann, wo man die Frage am Besten unterbringt. Nächstemal bitte besser...
-
Dieser Thread wurde von Moderator/in pumuckl aus dem Forum C++ in das Forum WinAPI verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Eine Möglichkeit zur Unterscheidung, ob das Programm von der Konsole aus oder "vom System" gestartet wurde, wäre z.B. die Verwendung der Funktion "StartServiceCtrlDispatcher()"
Die müsste beim Konsolenaufruf den Fehler "ERROR_FAILED_SERVICE_CONNECT" zurückgeben. Das kann aber relativ lange dauern.In der Literatur habe ich noch einen Hinweis auf eine andere Möglichkeit gefunden,
allerdings werde ich daraus nicht ganz schlau :"A better way is to query the console mode for the standard output
device. When running as a service the console are not availible and this
operation will fail."Habt ihr eine Idee, wie das funktionieren soll ?
-
Ich vermute, mit GetStdHandle sich den Handle auf StdOut besorgen und feststellen, daß es ihn nicht gibt.
Oder es gibt ihn und nur als Nicht-Servide hat man mit GetConsoleScreenBufferInfo Erfolg.
-
Ich hab' dazu bisher immer einen "/daemon" Switch verwendet.
Wenn der nicht angegeben wird, dann Service. Wenn er angegeben wird, dann kein Service, sondern Konsole.Kann man natürlich genausogut andersrum machen, also einen "/service" Switch.
Je nachdem was der häufigere Anwendungsfall ist.
Zeit investieren würde ich da nur wenn mir entweder fad ist, oder ich mir einen wirklichen Mehrwert dadurch verspreche. (Kann sein dass so ein Mehrwert bei dir gegeben ist! Bei mir war es nur noch nie der Fall.)
-
Ich benutze die Option -console oder -debug, wenn ich einen Dienst als Befehlszeilenprogramm starte. Entsprechende wird dann ja kein StartServiceCtrlDispatcher aufgerufen.
Bzw. wie schon erwähnt wird dan ERROR_FAILED_SERVICE_CONTROLLER_CONNECT zurückgegeben.
