Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Ouverture de fichier CHM sous Windows

8 réponses
Avatar
Paul Gaborit
On me demande dans un programme écrit en Perl/Tk d'ajouter une aide en
ligne.

Sous unix, je compte faire une arborescence de fichiers HTML et
appeler le navigateur par défaut pour la consultation.

Sous Windows, on me demande d'utiliser un fichier CHM (il me sera
fourni... ouf!). J'ai donc le chemin du fichier CHM. Mais je ne sais
pas quoi en faire car je ne connais pas la commande Windows standard
qui assure la consultation de ce genre de fichiers.

Auriez-vous une solution ?

Merci.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

8 réponses

Avatar
Paul Gaborit
À (at) Thu, 21 Feb 2008 18:10:21 +0100,
mdnews écrivait (wrote):
Rien de spécial à faire car l'extension est déjà associée (à winhlp32
ou hh) dans windows. Donc un simple:

system 'aide.chm';

ou

system 'start aide.chm';

start permet de lancer le fichier et rend la main


Ok. Je vais tester cette solution.

Merci.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Paul Gaborit
À (at) Thu, 21 Feb 2008 18:10:21 +0100,
mdnews écrivait (wrote):
On Thu, 21 Feb 2008 17:31:50 +0100, Paul Gaborit
wrote:
Sous Windows, on me demande d'utiliser un fichier CHM (il me sera
fourni... ouf!). J'ai donc le chemin du fichier CHM. Mais je ne sais
pas quoi en faire car je ne connais pas la commande Windows standard
qui assure la consultation de ce genre de fichiers.

Auriez-vous une solution ?


Rien de spécial à faire car l'extension est déjà associée (à winhlp32
ou hh) dans windows. Donc un simple:

system 'aide.chm';

ou

system 'start aide.chm';

start permet de lancer le fichier et rend la main


J'ai mis en oeuvre... et j'ai un petit problème. Avec 'start' utilisé
comme ça :

system "start", "monfichier.chm";

je n'ai qu'une interpréteur de commandes qui s'ouvre et pas de doc
chm. Et si je fais comme ça :

system "monfichier.chm";

il faut attendre que l'utilisateur quitte l'aide pour que 'system'
rende la main et, donc, que l'appli Tk continue à fonctionner (c'est
un peu embêtant pour une aide en ligne).

Auriez-vous une solution ?

Merci.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>


Avatar
Paul Gaborit
À (at) Wed, 19 Mar 2008 18:20:02 +0100,
mdnews écrivait (wrote):
- Ce sont des « ' » et pas « " » (important)
- Start est juste séparé par un espace du programme qu'il lance


Ok, donc on est obligé de passer par l'interpréteur de commandes en
faisant :

systeme "start lechemindufichier.chm";

et non :

systeme "start", "lechemindufichier.chm";

qui évite de passer par l'interpréteur mais ne fonctionne pas...

Je viens de retester pour voir
(petit exemple qui affiche l'aide de ntbackup)
%windir%system32 est une variable Windows


print "Debut du programmen";
system 'start %windir%system32ntbackup.chm';
print "Suite - L'aide est toujours afficheen";


Ok. Alors ma question devient : comment protéger correctement un
chemin dans l'interpréteur de commandes de Windows ?

En fait, je ne contrôle pas le chemin où est placé ce fichier CHM. Ça
peut être 'C:fichier.chm' ou 'C:Program FilesMachinfichier.chm' ou
n'importe quoi d'autre (un chemin avec potentiellement tous les
caractères autorisés par Windows).

Or, si je passe brutalement :

system 'start C:/Program Files/Machin/fichier.chm';

l'interpréteur windows coupe après Program !

D'accord, je peux préfixé les espaces par . Mais il y a peut-être
d'autres caractères qui risquent de poser problème...

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>

Avatar
Paul Gaborit
À (at) Thu, 20 Mar 2008 11:38:01 +0100,
mdnews écrivait (wrote):
Paul Gaborit >

system 'start C:/Program Files/Machin/fichier.chm';

l'interpréteur windows coupe après Program !



L'interprétation faite par windows est toujours un peu bizarre, car start
n'est pas un programme, mais une commande interne, du coup passé en
argument 0 ça ne fonctionne pas.

On peut bricoler en utilisant les noms courts

system ' start C:/Progra~1/Machin/fichier.chm ' ;

(pour connaître le nom court (8+3) d'un fichier ou répertoire)

DIR /X


Je veux bien bricoler... mais comment fait-on pour convertir un nom
long en nom court depuis un script Perl ?

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>


Avatar
jl_morel
Dans l'article ,
a dit...

Je veux bien bricoler... mais comment fait-on pour convertir un nom
long en nom court depuis un script Perl ?



Pour convertir un nom long en court, on utilise GetShortPathName du module
Win32 (standard) :

http://www.bribes.org/perl/docfr/win32.html#L23ECFD43

Plus généralement, j'ai bien cherché mais n'ai trouvé aucun module pour le
système d'aide Windows. Alors j'en ai écrit un en vitesse. Il n'est pas
très élaboré mais il permet d'ouvrir un fichier .chm où on veut.
Il s'appelle Win32-HtmlHelp. La doc est minimale.
Semble fonctionner sous XP et Vista (tests minimum).

On peut l'installer avec ppm :

ppm install http://www.bribes.org/perl/ppm/Win32-HtmlHelp.ppd

À essayer, en espérant que ça aide.
Toute suggestion est bienvenue.

--
J-L.M.
http://www.bribes.org/perl

Avatar
Paul Gaborit
À (at) 20 Mar 2008 11:59:16 GMT,
(Jean-Louis MOREL) écrivait (wrote):
Dans l'article ,
a dit...

Je veux bien bricoler... mais comment fait-on pour convertir un nom
long en nom court depuis un script Perl ?



Pour convertir un nom long en court, on utilise GetShortPathName du module
Win32 (standard) :

http://www.bribes.org/perl/docfr/win32.html#L23ECFD43


Malheureusement oui...

Plus généralement, j'ai bien cherché mais n'ai trouvé aucun module pour le
système d'aide Windows. Alors j'en ai écrit un en vitesse. Il n'est pas
très élaboré mais il permet d'ouvrir un fichier .chm où on veut.
Il s'appelle Win32-HtmlHelp. La doc est minimale.
Semble fonctionner sous XP et Vista (tests minimum).

On peut l'installer avec ppm :

ppm install http://www.bribes.org/perl/ppm/Win32-HtmlHelp.ppd

À essayer, en espérant que ça aide.
Toute suggestion est bienvenue.


Merci aussi pour ce module. Je le teste dès ce soir.

J'aurais aimé ne pas dépendre de modules spécifiquement Windows pour
éviter un test explicite de la plateforme dans mon programme. Mais, je
vois bien que je n'y couperai pas... :-(
(vous pourrez objecter avec raison qu'un fichier CHM est déjà
explicitement lié à Windows...)

En tous cas, merci pour votre aide précieuse à tous les deux.

--
Paul Gaborit - <http://perso.enstimac.fr/~gaborit/>
Perl en français - <http://perl.enstimac.fr/>


Avatar
M
À (at) Thu, 20 Mar 2008 11:38:01 +0100,
mdnews écrivait (wrote):
Paul Gaborit >

system 'start C:/Program Files/Machin/fichier.chm';

l'interpréteur windows coupe après Program !


L'interprétation faite par windows est toujours un peu bizarre, car start
n'est pas un programme, mais une commande interne, du coup passé en
argument 0 ça ne fonctionne pas.

On peut bricoler en utilisant les noms courts

system ' start C:/Progra~1/Machin/fichier.chm ' ;

(pour connaître le nom court (8+3) d'un fichier ou répertoire)

DIR /X


Je veux bien bricoler... mais comment fait-on pour convertir un nom
long en nom court depuis un script Perl ?

Bonjour,


Je ne sais pas si je comprends bien le problème, mais pour lancer des
programmes externes, j'utilise system sous Unix et Win32::Process sous
windows, XP dans mon cas.
Win32 permet de configurer aussi certaines choses (pas de fenêtre dos
pour des batchs). Voir CPAN pour plus d'information.

J'espère que ça pourra aider.

Marko



Avatar
Klaus
On Mar 19, 7:45 pm, Paul Gaborit wrote:

Or, si je passe brutalement :

system 'start C:/Program Files/Machin/fichier.chm';

l'interpréteur windows coupe après Program !


Voici comment se protéger contre des blancs :

si le système d'exploitation est Windows, alors
utiliser des guillemets pour se protéger contre des blancs
sinon
mettre systématiquement des anti-slash "" devant les blancs

Malheureusement, chaque système d'exploitation a sa propre méthode
pour se protéger contre les blancs: --> la méthode Windows ne marche
pas sous Unix et la méthode ne marche pas sous Windows.

je propose donc :

my $fic = q{C:/Program Files/Machin/fichier.chm};

if ($^O eq 'MSWin32') {
system( qq{start "$fic"} );
}
else {
$fic =~ s/ / /g;
system( qq{start $fic} );
}

--
Klaus