Comme à chaque fois que je prépare une nouvelle session de formation C++ 20 et 23, j’ai refait le tour des exemples que je présente. L’un d’eux concerne une des utilisations possibles du « deducing this », qu’il me parait intéressant de vous présenter.
(suite…)Étiquette : Formation
-
MSI et Windows Installer
A l’occasion d’une formation Installshield, j’ai rafraichi ma liste d’outils tournant autour de MSI et de Windows Installer.
Voilà un extrait de la panoplie :
MAKEMSI est un logiciel freeware qui permet de construire un package MSI à partir d’une description définie dans un fichier XML.
Dans la même lignée, j’aurais tendance à préférer WiX (Windows Installer Toolkit) qui utilise lui aussi une syntaxe XML pour décrire une installation. Il dispose d’un sous projet Votive pour manipuler ses fichiers avec Visual Studio.
Advance Installer est un outil de conception d’installation, avec une interface graphique, disponible sous plusieurs éditions. Il existe une édition gratuite qui permet de créer des projets simples.
Enfin, si Orca vous semble trop rudimentaire ou rébarbatif, vous pouvez utiliser InstEd pour éditer directement vos fichiers MSI.
-

Erreur 80243004 lors d’un update Windows
Lors de la préparation d’une formation Windows Server, je suis tombé sur un problème dont la cause m’a fait sourire.

En appliquant les mises à jour sur une machine virtuelle Windows Server, j’obtiens une erreur 80243004 et tout l’update échoue.
Un peu de recherche dans la base de connaissance Microsoft me donne la solution (https://support.microsoft.com/kb/2837515) : il faut que l’icône de notification de Windows Update soit activée dans la zone de notification pour que les mises à jour puissent se faire !
Je crois que c’est le bug le plus amusant que j’ai vu depuis quelques mois …
PS : Petit truc pour résoudre plus rapidement vos problèmes : N’utilisez pas une recherche large sur Google pour ce genre de difficultés. Vous avez un problème clairement identifié, chez un éditeur, avec un numéro ? Aller directement chercher dans les informations mises à disposition par cet éditeur vous fera gagner beaucoup de temps en n’ayant pas à lire de nombreux messages décrivant le même problème, sans fournir de solutions, ou – pire – donnant des solutions douteuses.
-
Surcharger l’opérateur new pour empêcher l’allocation dynamique d’un objet en C++
Parfois, il est nécessaire de restreindre des objets pour qu’ils ne puissent être utilisés qu’au travers de variables locales. Un cas typique est une classe qui utilise des ressources, allouées logiquement dans son constructeur, et libérées dans son destructeur.
Voici un exemple que j’utilise parfois dans les formations au C++.
Tout va bien si le programme détruit les objets lorsqu’ils n’en a plus besoin.
C’est le cas si on emploie ces objets à l’aide de variables locales : lorsque le programme quitte la portée dans laquelle la variable existe (nous présumons bien sûr que la variable n’est pas statique), l’objet est détruit, et le passage dans le destructeur libère les ressources allouées dans le constructeur.Le risque est qu’un développeur crée un objet en utilisant une allocation dynamique, car il pourrait ensuite oublier de détruire cet objet, bloquant ainsi les ressources.
Une solution pour supprimer ce risque consiste tout simplement à surcharger l’opérateur new de notre classe, de façon à empêcher l’allocation dynamique d’objets de cette classe. Voici un petit exemple qui montre le principe :
class maClasse { public: string chaine; maClasse() { // allocation des ressources chaine = "Les ressources sont allouees"; }; ~maClasse() { // libération des ressources cout << "Les ressources sont liberees" << endl; } void *operator new (size_t taille) { throw 0; return new int; // peut renvoyer n'importe quoi : on ne passera jamais ici } }; int main(int argc, char* argv[]) { { // bloc pour montrer la réservation et la libération des ressources maClasse C1; cout << C1.chaine << endl; } try { maClasse * pC = new maClasse; cout << pC->chaine << endl; } catch (int e) { cout << "Exception : " << e << endl; } int attente; cin >> attente; return 0; }La sortie nous montre que nous avons bien utilisé la variable locale, en allouant, puis en libérant les ressources, mais que l’utilisation d’une allocation dynamique échoue :
$ ./essai
Les ressources sont allouees
Les ressources sont liberees
Exception : 0 -
Comment utiliser Installshield pour effacer des fichiers lors d’une installation ?
Une question récurrente qui m’est posée lors d’interventions sur Installshield concerne la suppression de fichiers présents sur la machine cible au moment de l’installation.
Il est normal qu’elle soit posée, car la réponse n’apparaît pas de façon évidente dans l’interface du logiciel.
Si vous souhaitez supprimer des fichiers qui sont présents lors de l’installation, il faut renseigner la table RemoveFile, en vérifiant l’action RemoveFiles est bien présente dans la séquence d’installation.
Cette table contient contient une propriété DirProperty qui indique le chemin complet du répertoire du fichier à supprimer. InstallMode permet de spécifier si le fichier est effacé lors de l’installation, de la désinstallation ou dans les deux cas.

Le composant indiqué doit bien sur être associé à une fonctionnalité installée pour que l’opération soit exécutée.
Attention, l »interface graphique d’Installshield ne montre pas la liaison entre le composant et la table RemoveFile. Notamment, si on demande à n’afficher que les nœuds non vide, le composant peut apparaitre comme vide alors que la table RemoveFile fait référence au composant.

Vous pouvez constater que le composant EffaceFichier semble vide alors qu’il est utilisé pour supprimer des fichiers au travers de la table RemoveFile :

.
