Recuperer le fichier pointé par un raccourcis

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 394 fois - Téléchargée 30 fois

Contenu du snippet

Dans une appli, je donne le choix a l'utilisateur de spécifier un fichier MDB.
il m'est avantageux de le laisser selectionner un raccourcis.

cette petite fonction permet de récupérer le chemin du fichier pointé par le LNK.

Source / Exemple :


Public Function ResolveShortcut(ByRef vsLnkFilePath As String) As String
Dim hFile As Integer
Dim nByteBuffer As Byte
Dim nLongBuffer As Long
Dim nIntBuffer As Integer
Dim nPosFLI As Long  '# Position de départ de la FLI (File Location Info)
Dim nOffset_BasePath As Long
Dim nOffset_Network As Long
Dim nOffset_Remaining As Long

     hFile = FreeFile
     Open vsLnkFilePath For Binary Access Read As hFile
        Get hFile, 1, nLongBuffer
        '# les fichiers LNK commencent par un 'L'
        If nLongBuffer = 76 Then
            '# On skippe le GUID
            Seek hFile, 21

            '# On récupère les flags
            Get hFile, , nLongBuffer

            '# si la Shell Item ID liste est présente...
            If nLongBuffer And 1 Then
                Seek hFile, 77
                '# On récupère la taille totale de la liste
                Get hFile, , nIntBuffer
                '# et on décale d'autant le pointeur de lecture.
                nPosFLI = 79 + nIntBuffer
            Else
                nPosFLI = 77
            End If
        
            '# On skippe la taille, les flags, et les Local Volume Info
            Seek hFile, nPosFLI + 16
            '# Offset du chemin, si fichier local
            Get hFile, , nOffset_BasePath
            '# Offset du repertoire réseau
            Get hFile, , nOffset_Network
            '# Offset du reste (éventuel) du nom du fichier
            Get hFile, , nOffset_Remaining

            If nOffset_BasePath Then
                Seek hFile, nPosFLI + nOffset_BasePath
                Do
                    Get hFile, , nByteBuffer
                    If nByteBuffer <> 0 Then
                        ResolveShortcut = ResolveShortcut & ChrW$(nByteBuffer)
                    Else
                        Exit Do
                    End If
                Loop
            ElseIf nOffset_Network Then
                Seek hFile, nPosFLI + nOffset_Network + &H14
                Do
                    Get hFile, , nByteBuffer
                    If nByteBuffer <> 0 Then
                        ResolveShortcut = ResolveShortcut + ChrW$(nByteBuffer)
                    Else
                        Exit Do
                    End If
                Loop
                ResolveShortcut = ResolveShortcut & "\"
            End If
            If nOffset_Remaining Then
                Seek hFile, nPosFLI + nOffset_Remaining
                Do
                    Get hFile, , nByteBuffer
                    If nByteBuffer <> 0 Then
                        ResolveShortcut = ResolveShortcut + ChrW$(nByteBuffer)
                    Else
                        Exit Do
                    End If
                 Loop
            End If
        Else
            ResolveShortcut = vsLnkFilePath
        End If
    Close hFile
End Function

Conclusion :


Je sais que des codes existent sur VbFrance, mais cette version ne récupère que ce qui est nécessaire, et ne nécessite pas de dépendance externe (TLB pour IShellLink)

A voir également

Ajouter un commentaire Commentaires
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 1
14 sept. 2009 à 00:17
Bonsoir

Cette source m'intéresse mais hélas en la copiant dans mon projet j'ai beaucoup d'erreur.

Je pense que ce code est pour VB et pas pour VB NET 2008

Renfield y a pas moyen d'en avoir une adaptation.

J'essaye tout simplement de récupérer la cible contenu dans le fichier LNK et pour l'instant je tourne en rond.

J'ai essayé d'utiliser en faisant imports shell32 pour avoir Dim MonRaccourci_obj As ShellLinkObject mais je n'ai pas trouvé comment affecté l'emplacement du fichier LNK à l'objet pour l'ouvrir et récupérer la cible contenu dans le fichier.

Merci de votre aide en VB NET
cs_EBArtSoft Messages postés 4525 Date d'inscription dimanche 29 septembre 2002 Statut Modérateur Dernière intervention 22 avril 2019 9
8 sept. 2006 à 16:27
De plus MS a bien spécifier qu'il ne fallait s'attarder sur le format des LNK car il change a chaque version de windows. Autant utiliser IShellLink qui est libre et restera totalement compatible.

@+
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
8 sept. 2006 à 15:42
possible, oui, mais je ne vais pas m'y coller.

pas un ersatz de flemme, mais je vais finallement surement passer par IShellLink, car certains raccourcis sont mal analysés (Office 2003, par exemple)...

en même temps, l'info sur wotsit n'est pas une info officielle, et elle date un peu.
MadM@tt Messages postés 2167 Date d'inscription mardi 11 novembre 2003 Statut Membre Dernière intervention 16 juillet 2009 1
8 sept. 2006 à 15:30
www.wotsit.org > génial ce site c'est trop le genre d'infos que je galère à trouver
Sinon logiquement, il serait possible de trouver toutes les infos d'un raccourci en procédant pareil ? (histoire de se passer de IShellLink) En tout cas ce code est déjà bien pratique ^^
Renfield Messages postés 17287 Date d'inscription mercredi 2 janvier 2002 Statut Modérateur Dernière intervention 27 septembre 2021 71
7 sept. 2006 à 22:14
je l'ai "Snippeté" en même temps ^^

pour la doc, je suis parti du même fichier (vive wotsit)
Afficher les 9 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.