IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Discussion :

[IShellLink] Problème de modification de raccourci


Sujet :

Windows

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 049
    Billets dans le blog
    2
    Par défaut [IShellLink] Problème de modification de raccourci
    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.
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

  2. #2
    Rédacteur/Modérateur
    Avatar de M.Dlb
    Inscrit en
    Avril 2002
    Messages
    2 466
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Avril 2002
    Messages : 2 466
    Par défaut
    Salut

    Plusieurs questions :

    - Peux-tu récupérer un code d'erreur après ton appel à setPath ?
    - Est-ce que ce n'est pas setRelativePath, la bonne fonction ? (questio bête, mais je ne sais pas la différence entre les deux...)
    - As-tu essayé en récupérant un path au format UNC au lieu de raw ?

    SLGP_SHORTPATH
    Retrieves the standard short (8.3 format) file name.
    SLGP_UNCPRIORITY
    Retrieves the Universal Naming Convention (UNC) path name of the file.
    SLGP_RAWPATH
    Retrieves the raw path name. A raw path is something that might not exist and may include environment variables that need to be expanded.
    En espérant que ca pourra t'aider

    A bientôt

  3. #3
    Responsable Pascal, Lazarus et Assembleur


    Avatar de Alcatîz
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Mars 2003
    Messages
    8 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2003
    Messages : 8 049
    Billets dans le blog
    2
    Par défaut
    Un tout grand merci pour ta réponse !

    Le problème venait du fait que SetPath ne s'exécute que si le path à enregistrer est valide.

    Comme le programme est destiné à modifier les raccourcis dans les profils locaux suite à des modifications de mappings réseaux, il ne pourra être exécuté qu'après ces modifications.

    J'aurais dû y penser...
    Règles du forum
    Cours et tutoriels Pascal, Delphi, Lazarus et Assembleur
    Avant de poser une question, consultez les FAQ Pascal, Delphi, Lazarus et Assembleur
    Mes tutoriels et sources Pascal

    Le problème en ce bas monde est que les imbéciles sont sûrs d'eux et fiers comme des coqs de basse cour, alors que les gens intelligents sont emplis de doute. [Bertrand Russell]
    La tolérance atteindra un tel niveau que les personnes intelligentes seront interdites de toute réflexion afin de ne pas offenser les imbéciles. [Fiodor Mikhaïlovitch Dostoïevski]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/06/2006, 18h56
  2. Réponses: 4
    Dernier message: 30/03/2006, 18h14
  3. [vb6 et access] problème de modification de contenu de champ
    Par dj_tess dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 22/12/2005, 19h26
  4. Réponses: 19
    Dernier message: 28/10/2005, 17h29
  5. [débutant] Problème JSplitPane (modif :InternalFrame)
    Par pingoui dans le forum Agents de placement/Fenêtres
    Réponses: 61
    Dernier message: 03/09/2004, 17h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo