Windows

Empêcher l’ouverture d’une pop-up quand un programme Windows plante

Par défaut, quand votre programme C ou C++ plante sous Windows, une pop-up s’ouvre pour vous l’annoncer. Ça donne quelque chose comme ceci (avec mingw-w64 dans Eclipse) :

C’est sympa, mais ça peut poser des problèmes. En particulier, cela implique que votre programme continue de s’exécuter jusqu’à ce que quelqu’un clique sur le bouton « Fermer le programme« . Et ce quelqu’un n’arrivera peut-être jamais… C’est notamment le cas quand votre application crashe sur votre serveur d’intégration continue. L’application ne fait rien mais ne s’arrête pas sans que l’outil d’intégration continue ne puisse faire quoique ce soit (en fait, il ne le sait même pas), à part finir par faire un abort de la construction quand le timeout aura été atteint (si vous en avez configurer un…).

La solution est très simple, il suffit de rajouter une petite ligne au début de votre main() (en ayant bien sûr inclus le bon fichier d’en-tête) :

#include  <windows.h>

int main() {
    SetErrorMode (SEM_FAILCRITICALERRORS |
          SEM_NOGPFAULTERRORBOX | SEM_NOOPENFILEERRORBOX);

    // Votre programme

Votre programme s’arrêtera et le code de retour vous montera que le programme a planté :

Ça fonctionne aussi quand une exception n’est pas catchée ou quand votre programme rencontre un assert() qui échoue !

Pour plus de détails sur la fonction SetErrorMode():

  • sa documentation sur MSDN (vous y lirez ce magnifique commentaire : « Best practice is that all applications call the process-wide SetErrorMode function with a parameter of SEM_FAILCRITICALERRORS at startup. This is to prevent error mode dialogs from hanging the application. » =)
  • son implémentation dans mingw64

Lister les répertoires présents dans le path

J’étais (malheureusement) déjà grand quand j’ai découvert awk :

Bien qu’il soit rebutant aux premiers abords, on arrive assez rapidement à faire des choses sympathiques !

Cet article vous montre une ligne simple pour lister les répertoires présents dans le path grâce à awk. La première chose à faire est d’envoyer le contenu de la variable d’environnement PATH à awk grâce à un pipe. Le programme awk commence  par changer le séparateur de champ (FS pour Field Separator) dans BEGIN puis boucle pour afficher les champs.

Voici la commande complète pour Unix :

echo $PATH | awk 'BEGIN {FS=":"} { for(i = 1; i <= NF; i++) print $i}'

Sous Windows, le séparateur est différent et la récupération de la valeur de la variable d’environnement est différente. De plus, Cmder (la ligne de commande que j’utilise depuis près d’un an et demi sous Windows) n’aime pas les chevrons donc j’utilise une boucle while à la place de la boucle for :

echo %PATH% | awk 'BEGIN {FS=";"} { i = 0; while(i++ != NF) print $i}'

Pour finir, notez que la boucle commence à l’indice 1 et termine à l’indice NF (pour Number of Fields) inclus puisque $0 est l’argument entier et que $1 à $n correspondent aux morceaux de l’argument découpé selon FS.


Savoir ce qui prend de la place sur le disque dur de son PC Windows

Il y a quelques années, j’avais écrit un article expliquant comment savoir ce qui prend de la place sur le disque dur de son Mac. Il y a quelques semaines, j’ai eu besoin de faire la même chose sous Windows. Pour pouvoir changer de machine, je souhaitais d’abord sauvegarder les données mais après des années d’utilisation, il y avait des giga et des giga à transférer ! Il fallait faire un peu de tri mais l’éternelle question s’est à nouveau posée : par où commencer ?

Sous Mac, j’utilise Disk Inventory X. J’ai donc demandé à alternativeTo de me trouver une alternative pour Windows et il m’a conseillé WinDirStat. Il est disponible sous licence GLP v2 et est donc gratuit. Il est très léger, le téléchargement et l’installation se font en quelques minutes.

Au démarrage, il nous propose d’analyser tous les disques ou d’en sélectionner certains (et donc d’exclure les autres) :

WinDirStat - sélectionner des lecteurs

Pour l’exemple, je lui ai demandé d’analyser tous les lecteurs. Il mouline un moment :

WinDirStat - work in progress

Enfin, il affiche un graphique d’occupation :

windirstat - done

Les résultats ne sont pas ici très représentatifs car j’ai analysé une machine que je viens d’installer et qui ne me sert que pour le développement…il n’y a donc presque rien dessus. Très logiquement, c’est le dossier Windows qui prend le plus de place et le gros carré rouge en bas à gauche correspond à des fichiers systèmes. Lancez-le chez vous et je suis sûr que vos films, séries, photos et mp3 arriveront en haut du classement ! Bonnes analyses et bon courage pour le ménage.