Bonjour,
En vue de récupérer les icônes et les commandes des programmes dans la base de registre, j'utilise Win32::TieRegistry

Je n'obtiens ces informations qu'une fois sur deux... et encore !

Exemple de registres similaires :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
[HKEY_CLASSES_ROOT]
	|
	+--mailto-------------------(par défaut)--------REG_SZ---------Thunderbird URL
	|    |                  |
	|    |                  +---EditFlags-----------REG_WORD-------2
	|    |                  |
	|    |                  +---FriendlyTypeName----REG_SZ---------Thunderbird URL
	|    |                  |
	|    |                  +---URL Protocol--------REG_SZ
	|    |
	|    +---DefaultIcon--------(par défaut)--------REG_SZ---------C:\Program Files (x86)\Mozilla Thunderbird\thunderbird.exe,0
	|    |
	|    +---shell--------------(par défaut)--------REG_SZ---------(Valeur non définie)
	|         |
	|         +---open----------(par défaut)--------REG_SZ---------(Valeur non définie)
	|             |
	|             +---command---(par défaut)--------REG_SZ---------"C:\Program Files (x86)\Mozilla Thunderbird\thunderbird.exe" -osint -compose "%1"
	|
	=
	|
	+--migfile-------------------(par défaut)-------REG_SZ---------Migration Store
	|    |                  |
	|    |                  +---FriendlyTypeName----REG_EXPAND_SZ--@%systemroot%\system32\migwiz\wet.dll,-726RL
	|    |
	|    +---DefaultIcon--------(par défaut)--------REG_SZ---------%systemroot%\system32\migwiz\migwiz.exe,0
	|    |
	|    +---shell--------------(par défaut)--------REG_SZ---------(Valeur non définie)
	|         |
	|         +---open----------(par défaut)--------REG_SZ---------(Valeur non définie)
	|             |
	|             +---command---(par défaut)--------REG_SZ---------"C:\Windows\System32\migwiz\migwiz.exe" /Restore "%1"
	|
	|
	=


Mon programme, en fait 2 extraits :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
 
    sub win32_reg_read {
     my $sub_key = shift;
     my $value = shift;
 
     print "PRINT  $sub_key    $value\n\n";
 
     use Win32::TieRegistry ( Delimiter => '/' );
 
     my $HKEY_CLASSES_ROOT  = Win32::TieRegistry->new("HKEY_CLASSES_ROOT");
     if ($HKEY_CLASSES_ROOT) {
     	 print "OK HKEY  $HKEY_CLASSES_ROOT\n";
     	 #my $skey = $HKEY_CLASSES_ROOT->Open("mailto", { 'Delimiter' => '/' });
 
       my $skey = $HKEY_CLASSES_ROOT->Open($sub_key, { 'Delimiter' => '/' });
       if ($skey) {
       	print "OK SUBKEY $sub_key\n";
         my %key_values = $skey->GetValue($value);
         foreach (sort keys %key_values) {
         		print "EACH $_\n";
            print $_, "\n"; # a toi d'adapter ton code à ce que tu avais dans ta boucle
         }
       }
     }
    }
 
 
    # DefaultIcon & command
    print "\n\nNOT OK :\n"; 
    win32_reg_read("migfile/DefaultIcon","" );					# NOT OK
    print "\n\nNOT OK :\n";
    win32_reg_read("migfile","DefaultIcon" );						# NOT OK
    print "\n\nNOT OK :\n";
    win32_reg_read("migfile/shell/open/command","" );		# NOT OK
 
    print "\n\nOK :\n";
    win32_reg_read("mailto/DefaultIcon","" );						# OK
    print "\n\nOK :\n";
    win32_reg_read("mailto/shell/open/command","" );		# OK
    # -> renvoie Windows Standard
 
print "##################################################################\n";
print "\n\nAutre pgm :\n\n";
 
print "\n\nOK :\n";
my %RegHash;
use Win32::TieRegistry( TiedHash => \%RegHash );
use Data::Dumper;
my $Key = $RegHash{"HKEY_CLASSES_ROOT\\mailto"};
print Dumper $Key->SubKeyNames;
 
print "\n\nNOT OK :\n";
$Key = $RegHash{"HKEY_CLASSES_ROOT\\migfile"};
print Dumper $Key->SubKeyNames;
Et enfin les résultats sur la console :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
C:\DevPerl\Registre>perl regedit.pl
 
 
NOT OK :
PRINT  migfile/DefaultIcon
 
OK HKEY  Win32::TieRegistry=HASH(0x354eedc)
 
 
NOT OK :
PRINT  migfile    DefaultIcon
 
OK HKEY  Win32::TieRegistry=HASH(0x354dd2c)
 
 
NOT OK :
PRINT  migfile/shell/open/command
 
OK HKEY  Win32::TieRegistry=HASH(0x354ef4c)
 
 
OK :
PRINT  mailto/DefaultIcon
 
OK HKEY  Win32::TieRegistry=HASH(0x354dc8c)
OK SUBKEY mailto/DefaultIcon
EACH C:\Program Files (x86)\Mozilla Thunderbird\thunderbird.exe,0
C:\Program Files (x86)\Mozilla Thunderbird\thunderbird.exe,0
 
 
OK :
PRINT  mailto/shell/open/command
 
OK HKEY  Win32::TieRegistry=HASH(0x354ef3c)
OK SUBKEY mailto/shell/open/command
EACH "C:\Program Files (x86)\Mozilla Thunderbird\thunderbird.exe" -osint -compos
e "%1"
"C:\Program Files (x86)\Mozilla Thunderbird\thunderbird.exe" -osint -compose "%1
"
##################################################################
Autre pgm :
 
 
OK :
$VAR1 = 'DefaultIcon';
$VAR2 = 'shell';
 
 
NOT OK :
Can't call method "SubKeyNames" on an undefined value at regedit.pl line 58.
 
C:\DevPerl\Registre>
C'est ma première expérience de manipulation du registre en perl...
MERCI d'avance pour vos suggestions !