RS232 Befehl senden bevor Windows runterfährt

Gast #2261135
Lesenswert?

Hallo liebes Forum,
ich brauch mal wieder eure hilfe. Ich würde gerne ein kleines programm 
coden, am liebsten mit gcc mingw compiler. Das programm soll erkennen 
wenn der computer heruntergefahren wird und dann noch schnell einen 
kleinen String über die RS232 Schnittstelle aussenden. Prinzipiell 
stellt das ja kein großes problem da, aber wie kannn ich erkennen, bzw. 
abfragen wann Windows runterfährt. Als ansatz habe ich mir überlegt: 
Wenn Windows runterfährt, sagt es ja allen noch offenen Programmen 
"bescheid" das sie noch die möglichkeit haben sich ordentlich zu 
beenden, kann ich nicht irgendwie an dieser Stelle einharken und noch 
schnell einen befehl über RS232 senden? Aber wie komme ich an diese 
Stelle? Oder gibt es eine bessere Lösung? Ich habe auch gehört das es 
einen timer gibt der abläuft bis Windows runter fährt, kann ich 
eventuell abfragen ob dieser aufgeladen ist?


Vielen Dank schonmal für eure Hilfe
Persönliche Seite #2261164
Lesenswert?

Für Konsolapplikationen kannst Du mit SetConsoleCtrlHandler(1) eine 
Rückruffunktion(2) anmelden, die vom System beim Herunterfahren mit dem 
Flag CTRL_SHUTDOWN_EVENT aufgerufen wird.

Fensterbasierte Anwendungen bekommen WM_QUERYENDSESSION(3) gesandt und 
können dies entsprechend auswerten, aber nicht zwischen Herunterfahren 
und Benutzerabmeldung unterscheiden.

1) http://msdn.microsoft.com/en-us/library/ms686016(v=vs.85).aspx
2) http://msdn.microsoft.com/en-us/library/ms683242(v=vs.85).aspx
3) http://msdn.microsoft.com/en-us/library/aa376890(v=vs.85).aspx
Gast #2261266
Lesenswert?

Erst einmal vielen Dank an euch für die schnellen Antworten, wenn das 
über Eventghost funktionieren würde, währe das echt super, weil ich 
dieses Programm sowieso am laufen habe. Ich möchte nämlich über meinen 
HTPC meinen Fernseher ein und ausschalten können ;)... Also das senden 
vie RS232 habe ich ja gefunden, aber irgendwie finde ich nichts was mir 
bescheid sagt ob Windows runter fährt damit ich das senden auslösen 
kann....


@ Firefly irgendwie steige ich da nicht ganz durch, also ich rufe beim 
initzilisieren die Funktion wie folgt auf SetConsoleCtrlHandler(NULL,1); 
So dann schreibe ich eine Funktion die aufgerufen werden soll, wenn das 
System runterfährt... Wo übergebe ich diese denn dann? Damit das System 
weiss welche funktion das ist?

Gruß und Danke

Dominik
Persönliche Seite #2261274
Lesenswert?

Dominik schrieb:
> also ich rufe beim
> initzilisieren die Funktion wie folgt auf SetConsoleCtrlHandler(NULL,1);

Und warum tust Du das? Welche Bedeutung hat der erste Parameter, für den 
Du hier NULL übergibst?
1
A pointer to the application-defined HandlerRoutine function to 
2
be added or removed. This parameter can be NULL.

Zwar steht da, daß da auch NULL angegeben werden kann, aber das hat eine 
andere Bedeutung:
1
If the HandlerRoutine parameter is NULL, a TRUE value causes the 
2
calling process to ignore CTRL+C input, and a FALSE value 
3
restores normal processing of CTRL+C input.

Mit der Behandlung von Ctrl+C willst Du Dich aber gar nicht 
beschäftigen.
Gast #2261276
Lesenswert?

Dominik schrieb:
> ich rufe beim
> initzilisieren die Funktion wie folgt auf SetConsoleCtrlHandler(NULL,1);
Imho: Nein.

Eher so:
1
#include sowienoch
2
#include <windows.h>
3

4
BOOL WINAPI HandlerRoutine(DWORD dwCtrlType)
5
{
6
  if(dwCtrlType==CTRL_SHUTDOWN_EVENT)
7
    //tu was
8
}
9

10
int main ...
11
{
12
  SetConsoleCtrlHandler(HandlerRoutine,TRUE)
13
  ...
14
}

ABER:
1
CTRL_LOGOFF_EVENT
2
Note that this signal is *received only by services*. Interactive applications are terminated at logoff, so they are not present when the system sends this signal.
3

4
CTRL_SHUTDOWN_EVENT
5
A signal that the system sends when the system is shutting down. Interactive applications are not present by the time the system sends this signal, therefore it can be *received only be services* in this situation. Services also have their own notification mechanism for shutdown events. For more information, see Handler.
http://msdn.microsoft.com/en-us/library/ms683242%28v=vs.85%29.aspx
Gast #2261785
Lesenswert?

Sowas geht auch über die Group Policies von Windows. Einfach gpedit.msc 
aufrufen und dann unter "Computer Configuration"->"Windows 
Settings"->"Scripts (Startup/Shutdown)" eintragen. Logon/Logoff Aktionen 
stehen unter "User Configuration"->"Windows Settings"->"Scripts 
(Logon/Logoff)"

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren