RegisterApplicationRestart() ab Windows Vista
-
Hi Leutz,
ich erweitere grad meine Software um eine Langzeit-Protokollierung der seriellen Daten.
Dies funktioniert soweit prima.
Jedoch möchte ich, daß die Applikation und damit auch die Aufzeichnung automatisch fortgesetzt wird, sobald Windows neugestartet wird.
(z.B. bei einem kurzfristigen Spannungsausfall oder Akku des Laptops ist leer geworden)Wenn ich eine Aufzeichnung starte, rufe ich gleichzeitig
RegisterApplicationRestart( NULL, 0 );auf.
Analog ist es beim Beenden der Aufzeichnung, hier rufe ich
UnregisterApplicationRestart();auf.
(Diese beiden Funktionen gibts ab Windows Vista und jünger)Allerdings funktioniert der Restart nicht.
Um die Ursache einzugrenzen, in der MSDN ist zu lesen: "To prevent cyclical restarts, the system will only restart the application if it has been running for a minimum of 60 seconds."Hmmm, heißt das, die Applikation muß 1 Minute gelaufen sein (also vom Start des Prozesses bis zum Ende durch WM_CLOSE oder WM_ENDSESSION)
Oder heißt es möglicherweise so: Nach Aufruf von RegisterApplicationRestart() muß die Applikation noch mindestens 1 Minute weiterlaufen, damit der Restart-Mechanismus wirksam ist?Oder brauche ich dafür vielleicht Admin-Rechte, evtl. sogar elevated? (Dann hätte RegisterApplicationRestart() m.E. nicht mit S_OK zurückgeben dürfen)
Oder ist möglicherweise dieser Mechanismus gar nicht für normale Apps gedacht, sondern nur für Setup-Installer usw.?
Mein Compiler ist Visual C 6.0 (sorry, pflege ein altes Projekt weiter)
Das Zielsystem ist ein Windows Vista Home Premium.typedef HRESULT (WINAPI* PFN_REGISTERAPPLICATIONRESTART)( LPCWSTR, DWORD ); //Ab WinVista. void Log_RegisterApplicationRestart( void ) { HINSTANCE hinstance_dll; PFN_REGISTERAPPLICATIONRESTART pfn_RegisterApplicationRestart; if ( s_betriebssystemversion.e_os_id >= NE_OS_ID_WIN_VISTA ) { //Ab einschließlich Windows Vista gibts RegisterApplicationRestart(). hinstance_dll = LoadLibrary( TEXT( "Kernel32.dll" ) ); if ( hinstance_dll != NULL ) { //Kernel32.dll existiert. pfn_RegisterApplicationRestart = (PFN_REGISTERAPPLICATIONRESTART)GetProcAddress( hinstance_dll, "RegisterApplicationRestart" ); if ( pfn_RegisterApplicationRestart != NULL ) { //RegisterApplicationRestart() existiert in Kernel32.dll. VERIFY( pfn_RegisterApplicationRestart( NULL, 0 ) == S_OK ); } VERIFY( FreeLibrary( hinstance_dll ) ); hinstance_dll = NULL; } } else { //Bis einschließlich Windows XP und Server 2003 ... ... } } //Ende von Log_RegisterApplicationRestart().Woran kann es liegen, daß der Restart unter Windows Vista nicht funktioniert?
Habt Ihr ähnliche Erfahrungen gemacht?
Martin
-
Mal ne bescheidene Frage. Wie testest du das ganze?
Das mit dem 1 Minuten limit hat was mit wild gewordenen Prozessen zu tun die immer wieder crashen. Das tut dem system nicht gut.
-
evilissimo schrieb:
Wie testest du das ganze?
1. Applikation starten (nicht von der IDE aus, da eine IDE durchaus Shim an der Applikations-Umgebung durchführt, welche den Restart negativ beeinflußen könnte)
2. Menüpunkt "Aufzeichnung starten" -> ruft Log_RegisterApplicationRestart() auf.
3. Eine Minute warten
4. Applikation beenden
5. Windows Vista neustarten
6. Applikation wird nicht automatisch gestartet.Ich muß irgendwas übersehen haben...

Martin
-
Also wenn du Windows selbst neustartest dann solltest du eine der geläufigeren Methoden zum neustart auswählen ( z.B. HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run )
Das andere ist nur für den Fall falls der Prozess crasht, das system für ein update neu gestartet werden muss usw.
Bei normale Restarts vom Benutzer funktioniert das nicht.
-
Wenn Du denn Prozess beendest, wird er natürlich nicht neu gestartet

-
Jochen Kalmbach schrieb:
Wenn Du denn Prozess beendest, wird er natürlich nicht neu gestartet

Oh das hab ich natürlich in seiner Liste übersehen /o\
-
Danke für Eure Tipps.
Jochen Kalmbach schrieb:
Wenn Du denn Prozess beendest, wird er natürlich nicht neu gestartet

Oje, wie kann ich nur so dämlich sein...
Ich hätte den Punkt Nr. 4 weglassen sollen. Das werde ich mal später ausprobieren.
Wenn auch dieser Test negativ ist, werde ich zu dem ordinären Registry-Autorun Key zurückkehren.Martin
BTW: Ich habe unterschwellig angenommen, RegisterApplicationRestart() & Co. wäre der "saubere" und leistungsfähigerer (da crash-detect usw.) Nachfolger von Registry Run-Key.
Vergleichbar in etwa mit den Vista "Known Folders" (über COM) als Nachfolger für den SHGetFolderPath().