Éviter “Échec de l’extension de la constante utilisateur userdocs du dossier shell” dans Inno Setup

J’installe des exemples de documents dans un sous-dossier ‘PerfectTablePlan’ du dossier standard ‘Mes documents’ sous Windows. Cela fonctionne très bien pour 99% des utilisateurs. Mais si un utilisateur n’a pas de dossier “Mes documents”, j’obtiens un certain nombre de messages d’erreur de la forme:

Erreur interne: Impossible de développer la constante du dossier shell “userdocs”

Ce n’est pas très inspirant pour l’utilisateur!

Il est acceptable de ne pas installer les exemples pour ces utilisateurs (ou de les installer ailleurs). Mais ne pas montrer les messages d’erreur moche.

Le problème semble provenir de l’extension de macro ExpandConstant de {userdocs}.

Est-il possible de trouver le chemin de «Mes documents» sans utiliser de macro?

Ou un moyen de supprimer le message d’erreur? ExpandConstant lève une exception: http://www.jrsoftware.org/ishelp/index.php?topic=isxfunc_expandconstant

Les parties pertinentes de mon fichier .iss ressemblent à ceci:

#define MySampleDir "{code:SampleDirRoot}\PerfectTablePlan" ... [Files] Source: ..\binaries\windows\program\plans\*_v14.tp; DestDir: {#MySampleDir}\; Flags: ignoreversion onlyifdoesntexist createallsubdirs recursesubdirs uninsneveruninstall; Source: ..\binaries\windows\program\plans\*_v3.tps; DestDir: {#MySampleDir}\; Flags: ignoreversion onlyifdoesntexist createallsubdirs recursesubdirs uninsneveruninstall; ... [Code] function SampleDirRoot(Param: Ssortingng): Ssortingng; begin if DirExists( ExpandConstant('{userdocs}') ) then Result := ExpandConstant('{userdocs}') else Result := ExpandConstant('{allusersprofile}') end; 

L’éxéption:

Échec de l’extension de la constante du dossier shell

est déclenché SHGetFolderPath fonction interne appelée SHGetFolderPath (appelée depuis ExpandConstant lors de l’extension d’une constante de dossier shell) renvoie une chaîne de chemin vide pour le dossier CSIDL donné, dans ce cas pour l’identificateur CSIDL_PERSONAL .

Cela signifie que l’utilisateur n’a pas le dossier CSIDL_PERSONAL . Je me demande comment configurer le compte utilisateur Windows pour ne pas avoir ce dossier. Eh bien, vous pouvez contourner ce problème (ou une mauvaise configuration de Windows?) En try..except l’exception interne try..except dans le bloc try..except :

 [Code] function SampleDirRoot(Param: ssortingng): ssortingng; var Folder: ssortingng; begin try // first try to expand the {userdocs} folder; if this raises that // internal exception, you'll fall down to the except block where // you expand the {allusersprofile} Folder := ExpandConstant('{userdocs}'); // the {userdocs} folder expanding succeded, so let's test if the // folder exists and if not, expand {allusersprofile} if not DirExists(Folder) then Folder := ExpandConstant('{allusersprofile}'); except Folder := ExpandConstant('{allusersprofile}'); end; // return the result Result := Folder; end; 

Mais je n’ai jamais entendu parler de la possibilité de ne pas avoir le dossier CSIDL_PERSONAL . Veuillez noter que le code ci-dessus protège uniquement la constante {userdocs} .

Nous utilisons la redirection de dossier ici et nous avons rencontré des problèmes similaires à d’autres applications (GnuCash, UFile). Le problème dans notre cas était dû à une fonctionnalité appelée Migration des dossiers redirigés *, qui dans certains cas ne mettait pas à jour les parameters du registre de l’utilisateur pour indiquer le nouvel emplacement une fois la migration terminée (notez que cette migration peut durer plusieurs semaines). ensemble).

Quoi qu’il en soit, ce n’est pas que l’entrée était vide, mais qu’elle indiquait un SERVER \ SHARE qui avait été mis hors ligne des semaines plus tôt.

Exécuter un gpupdate /force pour chaque utilisateur actif sur chaque machine a corrigé notre problème, car il mettait à jour le registre et indiquait à l’utilisateur qu’il devait se déconnecter / se connecter.


* La migration des dossiers redirigés permet à un administrateur de spécifier que le dossier Mes documents de chaque utilisateur (par exemple) doit être déplacé d’un emplacement réseau à un autre. Il le fait de manière lente et mesurée la prochaine fois que l’utilisateur ouvre une session sur le domaine (n’importe quel poste de travail) (donc, si votre dernier utilisateur ne se connecte que dans un mois, le processus prend un mois). C’est une belle idée en théorie, mais dans la pratique, c’est un grand PITA.

Incidemment, le «partage n’existe pas car il emprunte l’identité d’un autre utilisateur» ne devrait pas poser de problème avec les dossiers correctement redirigés car la redirection doit utiliser une URL et non une lettre de lecteur mappée (par exemple, \\ server \ RedirectedUserFolders \ SOME-USER \ Mes documents, bien que les permissions puissent poser problème si vous supprimez certains droits par défaut).