Bonjour à toutes et tous !

Je suis en train de terminer un petit utilitaire qui modifie à la volée les chemins dans tous les fichiers raccourcis de l'utilisateur courant.

Le programme s'exécute sans erreur de runtime mais refuse obstinément de modifier le path de la cible. Par contre, le répertoire de travail est bien modifié.

Vous trouverez ci-dessous, en condensé, le code (Pascal) du programme. L'erreur constatée est au niveau de la procédure RECHERCHE_RECURSIVE : la méthode ISHellLink::SetPath renvoie S_FALSE et je ne comprends pas pourquoi.

Pourriez-vous jeter un oeil sur le code pour voir si je n'ai pas fait une erreur de flag quelque part, ou pour me dire si ma méthode n'est pas bonne ?

Merci d'avance !
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
Var hRes : hResult;
    BufferChemin : Array [0..MAX_PATH] of Char;
    Memory : PIMalloc;
    pIdL : LPITEMIDLIST;
    SL : pIShellLink;
    PF : pIPersistFile;
    w : Array [0..MAX_PATH] of WChar;
    szChemin : Array [0..MAX_PATH] of Char;
    Win32FindData : tWin32FindData;


Procedure RECHERCHE_RECURSIVE;
Begin

  ...

  { Lorsqu'un fichier *.lnk est trouvé, BufferChemin est son path }
  MultiByteToWideChar(CP_ACP,0,BufferChemin,-1,@w,SizeOf(w));
  if PF^.Vtbl^.Load(PF,@w,STGM_READWRITE) = S_OK then
    begin
      if SL^.Vtbl^.Resolve(SL,0,SLR_NO_UI or SLR_UPDATE) = S_OK then
        begin
          { 1. Modification du chemin }
          if SL^.Vtbl^.GetPath(SL,szChemin,SizeOf(szChemin),Win32FindData,SLGP_RAWPATH) = S_OK then
            begin

              ...

              { Modification de szChemin }

              ...

              SL^.Vtbl^.SetPath&#40;SL,szChemin&#41;;   <=== RENVOIE S_FALSE
            end;

          &#123; 2. Modification du dossier de travail &#125;
          if SL^.Vtbl^.GetWorkingDirectory&#40;SL,szChemin,SizeOf&#40;szChemin&#41;&#41; = S_OK then
            begin

              ...

              &#123; Modification de szChemin &#125;

              ...

              SL^.Vtbl^.SetWorkingDirectory&#40;SL,szChemin&#41;;   <=== ET ICI C'EST OK
            end;

          &#123; 3. Enregistrement des changements &#125;
          PF^.Vtbl^.Save&#40;PF,Nil,False&#41;;
        end;
    end;


  ...

End;



Begin   &#123; Main &#125;
  if CoInitialize&#40;Nil&#41; = S_OK then
    begin
      if CoCreateInstance&#40;CLSID_ShellLink,Nil,CLSCTX_INPROC_SERVER or
                          CLSCTX_LOCAL_SERVER,IID_IShellLink,SL&#41; = S_OK then
        begin
          if SL^.Vtbl^.QueryInterface&#40;SL,IID_IPersistFile,PF&#41; = S_OK then
            begin
              if SHGetMalloc&#40;@Memory&#41; = NOERROR then
                begin
                  SHGetSpecialFolderLocation&#40;0,CSIDL_DESKTOPDIRECTORY,pIdL&#41;;
                  if pIdL <> Nil then
                    begin
                      SHGetPathFromIDList&#40;pIdL,BufferChemin&#41;;

                      &#123; Recherche de tous les fichiers *.lnk &#125;
                      RECHERCHE_RECURSIVE&#40;BufferChemin&#41;;

                      Memory^.Vtbl^.Free&#40;Memory,pIdL&#41;;
                    end;
                  Memory^.Vtbl^.Release&#40;Memory&#41;;
                end;
              PF^.Vtbl^.Release&#40;PF&#41;;
            end;
          SL^.Vtbl^.Release&#40;SL&#41;;
        end;
      CoUninitialize;
    end;
End.