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

Delphi Discussion :

Lecture d'un fichier .LNK


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Par défaut Lecture d'un fichier .LNK
    Bonjour à tous

    J'ai besoin de savoir si un .LNK pointe vers un fichier ou un répertoire. Je veux donc vérifier ce point en lisant le nom du fichier ou répertoire pointé par le lien.

    Consulté (notamment) ces adresses :
    http://www.developpez.net/forums/d54...nk-raccourcis/

    http://www.developpez.net/forums/d34...contenu-d-lnk/

    J'ai retenu ce code :
    Ds les USUS : ShlObj, ActiveX, ComObj;

    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
    const
       TAILLE_BUFFER = 1024;
       IID_IPersistFile: TGUID = (D1: $0000010B; D2: $0000; D3: $0000; D4: ($C0, $00, $00, $00, $00, $00, $00, $46));
    
    type
       ArrayChar = array[0..TAILLE_BUFFER] of Char;
    
    Var  // globales
      // POUR LIRE LE F.LNK -------------------------
      PersistFile: IPersistFile;
      FileNameW: array[0..MAX_PATH] of WideChar;
      ShellLink: IShellLink;
      fd: TWin32FindData;
      ProLink: ArrayChar;
      I: Word;
      J: Integer;
      // --------------------------------------------
    
    
    
    procedure TForm1.Btn_LireClick(Sender: TObject);
    Var
      Nom_F_Lnk : String;
      Lst_Test_Fn : TStringList;
    
    begin
    
      Nom_F_LNK := 'GLOSSAIRES.lnk';  // Le fichier .LNK est ds le répertoire courant
      Form1.Lab_Aff_F_Lnk.Caption := UpperCase(Nom_F_LNK);
    
      Lst_Test_Fn := Lire_Infos_F_LNK(Nom_F_LNK);
      Lst_Test_Fn.SaveToFile('Z-RESULTAT.TMP');
    
    end;
    
    
    Function Lire_Infos_F_LNK(szChemin: String): TStringList;
    Var
      Nom_F_Lnk : string;
      Lst_Retour : TStringList;
    
    begin
    
          Lst_Retour := TStringList.Create;
          CoInitialize(nil);
          try
             OleCheck(CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IID_IShellLinkA, ShellLink));
             try
                OleCheck(ShellLink.QueryInterface(IID_IPersistFile, PersistFile));
                try
                   MultiByteToWideChar(CP_ACP, 0, @szChemin[1], -1, FileNameW, MAX_PATH);
                   OleCheck(PersistFile.Load(FileNameW, STGM_READ));		// C'est là que ça plante
                   ShellLink.GetPath(ProLink, Max_Path, fd, SLGP_UNCPRIORITY);
                   Lst_Retour.Add(ProLink);
                finally
                end;
             finally
             end;
          finally
             CoUninitialize;
          end;
    end;
    Plantage avec le message (Erreur 2) "Fichier spécifié introuvable". Pourquoi ?

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    14 089
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 14 089
    Par défaut
    Mon code est très proche du tien sauf le transtypage en PChar bien plus simple en XE2

    Essaye mon code remplaçant IID_IShellLinkW par IID_IShellLinkA si tu es en D7

    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
     
    Winapi.Windows, Winapi.ShellApi, Winapi.ShlObj, Winapi.Messages, Winapi.ActiveX,
      System.Classes, System.SysUtils;
     
    type
      /// <summary>TSLTShellLink encapsule l'utilisation de l'interface IShellLink</summary>
      TSLTShellLink = class(TObject)
      public
        class function ExtractTarget(const AShellLinkFileName: TFileName): TFileName;
      end;
     
    { TSLTShellLink }
     
    //------------------------------------------------------------------------------
    class function TSLTShellLink.ExtractTarget(const AShellLinkFileName: TFileName): TFileName;
    // Voir la fonction cachée "GetFileNameFromLink" dans Vcl.ExtDlgs
    // Ne pase inclure Winapi.Ole2 qui contient IID_IPersistFile, cela devient trop pénible les conflits entre TGUID de Delphi et TGUID de Winapi.Ole2
    const
      IID_IPersistFile: TGUID = '{0000010B-0000-0000-C000-000000000046}';
    var
      LResult: HRESULT;
      LSHellLink: IShellLink;
      LPersistFile: IPersistFile;
      LFindData: TWin32FindData;
      FileName: array[0..MAX_PATH - 1] of Char;
    begin
      Result := '';
      LResult := CoCreateInstance(CLSID_ShellLink, nil, CLSCTX_INPROC_SERVER, IID_IShellLinkW, LShellLink);
      if LResult = S_OK then
      begin
        if Supports(LShellLink, IID_IPersistFile, LPersistFile) then
        begin
          LResult := LPersistFile.Load(PChar(AShellLinkFileName), STGM_READ);
          if LResult = S_OK then
          begin
            LResult := LSHellLink.GetPath(FileName, MAX_PATH, LFindData, SLGP_UNCPRIORITY);
            if LResult = S_OK then
              Result := Trim(FileName);
          end;
        end;
      end;
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Par défaut
    Bonjour, Shaire.

    XE7 . Mais je vais le tenter tout de même. Merci

  4. #4
    Membre Expert
    Avatar de Lung
    Profil pro
    Analyste-programmeur
    Inscrit en
    Mai 2002
    Messages
    2 704
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste-programmeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 704
    Par défaut
    J'ai testé sous XE7, et ça marche bien !

    L'urgent est fait, l'impossible est en cours, pour les miracles prévoir un délai. :bug: ___ "http://club.developpez.com/regles/#LIII-A"Écrivez dans un français correct !!

    C++Builder 5 - Delphi 6#2 Entreprise - Delphi 2007 Entreprise - Delphi 2010 Architecte - Delphi XE Entreprise - Delphi XE7 Entreprise - Delphi 10 Entreprise - Delphi 10.4.2 Entreprise - Delphi 11.3 Entreprise - Visual studio 2022
    OpenGL 2.1 - Oracle 10g - Paradox - Interbase (XE) - PostgreSQL (15.7)

  5. #5
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    540
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 540
    Par défaut
    Bonsoir à tous

    @Shaire : ça march nickel.

    Voici le code tel que je l'exploite :

    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
     
     
    Procedure Test_Fn_Shaire_Le_Troll;
    Var
      Nom_F_LNK : string;
      Nom_F_Pointe : string;
     
    begin
     
      Nom_F_LNK := 'Circoncision.lnk';
      Nom_F_pointe := TSLTShellLink.ExtractTarget(Nom_F_LNK);
      Form1.Lab_Aff_Retour_Fn_Shaire.Caption := Nom_F_Pointe;
     
      if Tst_F_Est_Un_Rep(Nom_F_pointe) = True then Form1.Lab_Aff_Si_Directory.Caption := 'OUI'  // Tst_F_Est_Un_Rep : fonction avec test des bits en ASM
      Else Form1.Lab_Aff_Si_Directory.Caption := 'NON';
     
    end;
    Merci

  6. #6
    Membre Expert

    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2007
    Messages
    3 530
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 530
    Par défaut
    ça irait bien dans la faq ce bout de code ;-)

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

Discussions similaires

  1. [Windows]lecture des fichier lnk (raccourcis)
    Par Tiaps dans le forum API standards et tierces
    Réponses: 10
    Dernier message: 21/10/2009, 19h27
  2. Réponses: 6
    Dernier message: 02/09/2003, 15h12
  3. Lecture et ecriture fichier .ini
    Par despe dans le forum C
    Réponses: 6
    Dernier message: 23/07/2003, 20h40
  4. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 4
    Dernier message: 05/02/2003, 08h54
  5. [langage] Optimiser la lecture d'un fichier
    Par And_the_problem_is dans le forum Langage
    Réponses: 2
    Dernier message: 11/06/2002, 10h24

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