Solved

VB6 routine to retrieve URL from shortcut

Posted on 2009-05-12
5
1,007 Views
Last Modified: 2012-05-06
The simple code block below retrieves the target path of a "*.lnk" file: a shortcut pointing to another file or directory to which the user has reference.  In the event that the shortcut is a URL, the extension will be *.url, and the code below will not work.
(The verbiage of "CreateShortcut" here is confusing because if the shortcut already exists, as I intend, "CreateShortcut" will report back on the existing shortcut, not, as the name implies, overwrite the existing one.)
I've built the infrastructure to accomodate a little added challenge: I would like the code below to be dual-purpose.  It should test whether the extension is ".lnk" or ".url" and, in either case, return the shortcut path.  Thanks, ~Peter Ferber

Function RetrieveShortcutPath(strShortcutPath As String) As String

    Dim MyShell As New WshShell

    Dim MyShortcut As WshShortcut

    

    If (instr(ucase(strShortcutPath), ".LNK") > 0) then

        Set MyShortcut = MyShell.CreateShortcut(strShortcutPath)

        RetrieveShortcutPath = MyShortcut.TargetPath

    Else

    End If

End Function

Open in new window

0
Comment
Question by:PeterFrb
  • 3
  • 2
5 Comments
 

Author Comment

by:PeterFrb
ID: 24368955
P.S.  If the object in question requires me to make a reference other than "Windows Script Host Object Model", which allows me to instantiate WshShell and WshShortcut, please specify that as well.
~Peter
0
 
LVL 10

Accepted Solution

by:
peetm earned 500 total points
ID: 24372158
A bit cludgy but ... here goes:

I'm using a generic Object to save using two derived types - WshShortcut and WshURLShortcut.

Object is polymorphic with ALL object types, and as both the ones you're interested in have the 'TargetPath' property, it seems suitable.


The 'file stuff' is handled by a FileSystemObject - add the 'Microsoft Scripting Runtime' as a reference.

    Dim fso As New FileSystemObject

    Dim wsh As New WshShell

    

    Dim f As File

        

    ' No polymorphism for WshShortcut and WshURLShortcut - except through a generic 'object'.

    '

    Dim o As Object

    

    ' Get the user's 'Desktop'.

    '

    For Each f In fso.GetFolder(fso.BuildPath(Environ("HOMEPATH"), "Desktop")).Files

    

        Set o = Nothing

    

        ' Is this file *Either* link type?

        '

        If Right$(f.Path, 4) = ".lnk" Or Right$(f.Path, 4) = ".url" Then

        

            Set o = wsh.CreateShortcut(f.Path)

        

            If Not o Is Nothing Then

            

                Debug.Print o.TargetPath

            

            End If

        

        End If

    

    Next f

Open in new window

0
 

Author Closing Comment

by:PeterFrb
ID: 31580714
Well done, thanks.
0
 

Author Comment

by:PeterFrb
ID: 24377377
You clearly understood the assignment fully and delivered on the answer.  I appreciate your comment indicating that the two choices are "WshShortcut and WshURLShortcut" -- the latter of which I was unaware.  I've added the code as a function, which I personally find useful, by merely modifying your code into a form I find useful.
Thanks,
~Peter
Function RetrieveShortcutPath(strShortcutPath As String) As String

    Dim fso As New FileSystemObject

    Dim wsh As New WshShell

    

    Dim f As File

        

    ' No polymorphism for WshShortcut and WshURLShortcut - except through a generic 'object'.

    Dim o As Object

    

    ' Get the user's 'Desktop'.

    Set o = Nothing

    ' Is this file *Either* link type?

    RetrieveShortcutPath = ""

    If (Right$(strShortcutPath, 4) = ".lnk" Or Right$(strShortcutPath, 4) = ".url") Then

        Set o = wsh.CreateShortcut(strShortcutPath)

        If (Not o Is Nothing) Then

            RetrieveShortcutPath = o.TargetPath

        End If

    End If

End Function

Open in new window

0
 
LVL 10

Expert Comment

by:peetm
ID: 24377625
Glad to be of help.

Looks like you can remove the FileSystemObject reference, and the declaration of f As File now?

Oh, and the ' Get the user's 'Desktop' comment.

0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

The debugging module of the VB 6 IDE can be accessed by way of the Debug menu item. That menu item can normally be found in the IDE's main menu line as shown in this picture.   There is also a companion Debug Toolbar that looks like the followin…
Enums (shorthand for ‘enumerations’) are not often used by programmers but they can be quite valuable when they are.  What are they? An Enum is just a type of variable like a string or an Integer, but in this case one that you create that contains…
Get people started with the process of using Access VBA to control Outlook using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Microsoft Outlook. Using automation, an Access applic…
Get people started with the utilization of class modules. Class modules can be a powerful tool in Microsoft Access. They allow you to create self-contained objects that encapsulate functionality. They can easily hide the complexity of a process from…

863 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

28 Experts available now in Live!

Get 1:1 Help Now