I. Quelle est la technologie qui permet à Windows de redémarrer automatiquement votre application en cas de défaillance de celle-ci ?

Windows 7 et Windows 2008 R2, fournissent des APIS, qui permettent à une application si elle défaille de :

  • S'enregistrer pour qu'elle redémarre automatiquement
  • Fournir un pointeur de fonction afin que Windows puisse la rappeler pour sauvegarder d'éventuelles données, avant l'arrêt et le redémarrage.

Ces deux fonctionnalités ne sont actives qu'après 60 secondes après leur enregistrement.

Pour les développeurs .NET, cette API est disponible dans Windows API Code Pack, sous l'espace de nom Microsoft.WindowsAPICodePack.ApplicationServices (http://code.msdn.microsoft.com/WindowsAPICodePack.)

Listing C#
Sélectionnez
ApplicationRestartRecoveryManager.RegisterForApplicationRestart(new RestartSettings("/restart", RestartRestrictions.NotOnReboot | RestartRestrictions.NotOnPatch));

RecoveryData donnees=new RecoveryData (new RecoveryCallback (ProcedureDeRappel),null );
RecoverySettings configuration=new RecoverySettings (donnees,0);
ApplicationRestartRecoveryManager.RegisterForApplicationRecovery(configuration);

private int ProcedureDeRappel(object state)
{
	bool IsCanceled = 
	ApplicationRestartRecoveryManager.ApplicationRecoveryInProgress();
	MessageBox.Show("Procedure De Rappel"); 
	if (IsCanceled)
	{
		MessageBox.Show("Annulée par l'utilisateur");
		Environment.Exit(2);
	}
	return 0;
}
Listing VB
Sélectionnez
ApplicationRestartRecoveryManager.RegisterForApplicationRestart(New RestartSettings("/restart", (RestartRestrictions.NotOnReboot Or RestartRestrictions.NotOnPatch)))
Dim donnees As New RecoveryData(New RecoveryCallback(AddressOf Me.ProcedureDeRappel), Nothing)
Dim configuration As New RecoverySettings(donnees, 0)
ApplicationRestartRecoveryManager.RegisterForApplicationRecovery(configuration)

Private Function ProcedureDeRappel(ByVal state As Object) As Integer
	Dim IsCanceled As Boolean = ApplicationRestartRecoveryManager.ApplicationRecoveryInProgress
	MessageBox.Show("Procedure De Rappel")
	If IsCanceled Then
		MessageBox.Show("Annulée par l'utilisateur")
		Environment.Exit(2)
	End If
	Return 0
End Function

Pour les développeurs MFC, la prise en charge se fait automatiquement à partir de l'assistant :

Image non disponible

Pour les développeurs Win32 il faut utiliser les API :

 
Sélectionnez
RegisterApplicationRestart(PCWSTR pwzCommandline, DWORD dwFlags)
RegisterApplicationRecoveryCallback(APPLICATION_RECOVERY_CALLBACK pRecoveryCallback,
  PVOID pvParameter,
  DWORD dwPingInterval,
  DWORD dwFlags
);
Pour plus d'infos :