Forum: PC-Programmierung RS232 Befehl senden bevor Windows runterfährt


von Dominik (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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

von Christian R. (supachris)


Lesenswert?

Geht auch ganz ohne programmieren einfach mit Eventghost.

von Dominik (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von abc (Gast)


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

von Dominik (Gast)


Lesenswert?

Okay, also muss ich dann da den Zeiger auf die Funktion übergeben, die 
beim shutdown aufgerufen werden soll?


Danke

von Dominik (Gast)


Lesenswert?

Also aus deinem aber interpretiere ich, das es nur als Dienst 
funktioniert.. Ist das richtig?

Gruß

von Christian R. (supachris)


Lesenswert?

Dominik schrieb:
> aber irgendwie finde ich nichts was mir
> bescheid sagt ob Windows runter fährt damit ich das senden auslösen
> kann....

Hier stehts: http://www.eventghost.org/forum/viewtopic.php?f=1&t=1230 in 
den letzten 2 Posts unten.

von Dominik (Gast)


Lesenswert?

Ist das richtig, die exe muss als dienst laufen, damit das funktioniert 
wie im Beispiel von "abc"?

Gruß

von ... (Gast)


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)"

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.