User Tools

Site Tools


reading_20a_20shortcut

Reading a shortcut

by Jon Ripley, January 2008

If you want to read the name of the file or directory pointed to by a short cut (link) file you can use the routine listed below. FNShell_GetShortcut takes a full path to a short cut (link) file and returns a path to the linked file:

        DEF FNShell_GetShortcut(LinkFile$)
        LOCAL ole32%, clsid%, iidsl%, iidpf%, wsz%, psl%, ppf%, psl{}, ppf{}, path%
 
        DIM clsid% LOCAL 15, iidsl% LOCAL 15, iidpf% LOCAL 15, path% LOCAL 255
        DIM wsz% LOCAL 2*LEN(LinkFile$)+1
        DIM psl{QueryInterface%, AddRef%, Release%, GetPath%, GetIDList%, SetIDList%, \
        \       GetDescription%, SetDescription%, GetWorkingDirectory%, \
        \       SetWorkingDirectory%, GetArguments%, SetArguments%, \
        \       GetHotkey%, SetHotkey%, GetShowCmd%, SetShowCmd%, GetIconLocation%, \
        \       SetIconLocation%, SetRelativePath%, Resolve%, SetPath%}
        DIM ppf{QueryInterface%, AddRef%, Release%, GetClassID%, IsDirty%, \
        \       Load%, Save%, SaveCompleted%, GetCurFile%}
 
        SYS "LoadLibrary", "OLE32.DLL" TO ole32%
        SYS "GetProcAddress", ole32%, "CoInitialize" TO `CoInitialize`
        SYS "GetProcAddress", ole32%, "CoUninitialize" TO `CoUninitialize`
        SYS "GetProcAddress", ole32%, "CoCreateInstance" TO `CoCreateInstance`
 
        SYS `CoInitialize`, 0
 
        clsid%!0  = &00021401 : REM CLSID_ShellLink
        clsid%!4  = &00000000
        clsid%!8  = &000000C0
        clsid%!12 = &46000000
 
        iidsl%!0  = &000214EE : REM IID_IShellLink
        iidsl%!4  = &00000000
        iidsl%!8  = &000000C0
        iidsl%!12 = &46000000
 
        iidpf%!0  = &0000010B : REM IID_IPersistFile
        iidpf%!4  = &00000000
        iidpf%!8  = &000000C0
        iidpf%!12 = &46000000
 
        REM Get a pointer to the IShellLink interface:
        _CLSCTX_INPROC_SERVER = 1
        SYS `CoCreateInstance`, clsid%, 0, _CLSCTX_INPROC_SERVER, iidsl%, ^psl%
        IF psl% = 0 ERROR 100, "Cannot create IShellLink interface"
        !(^psl{}+4) = !psl%
 
        REM Query IShellLink for the IPersistFile interface:
        SYS psl.QueryInterface%, psl%, iidpf%, ^ppf%
        IF ppf% = 0 ERROR 100, "Cannot create IPersistFile interface"
        !(^ppf{}+4) = !ppf%
 
        REM Convert the path string to Unicode:
        SYS "MultiByteToWideChar", 0, 0, LinkFile$, -1, wsz%, LEN(LinkFile$)+1
 
        REM Load the link by calling IPersistFile::Load:
        SYS ppf.Load%, ppf%, wsz%, 0
 
        REM Get the target object:
        SYS psl.GetPath%, psl%, path%, 256, 0, 0
 
        REM Tidy up:
        SYS ppf.Release%, ppf%
        SYS psl.Release%, psl%
        SYS `CoUninitialize`
        =$$path%


For information about how to create a short cut see the article on creating a shortcut.

This website uses cookies. By using the website, you agree with storing cookies on your computer. Also you acknowledge that you have read and understand our Privacy Policy. If you do not agree leave the website.More information about cookies
reading_20a_20shortcut.txt · Last modified: 2024/01/05 00:21 by 127.0.0.1