File "ReadShortcut.inc"

Path: /ShuffleGUI/inc/ReadShortcut.inc
File size: 5.77 KB
MIME-type:
Charset: utf-8

'--------------------------------------------------------------------------------
' This is ReadShortcut.inc v0.2 for PBWin9. Usage:
' ? ReadShortcut (PathToLnkFile)
'--------------------------------------------------------------------------------
#INCLUDE ONCE "Win32Api.inc"
#INCLUDE ONCE "ObjBase.inc"
'--------------------------------------------------------------------------------
%HOTKEYF_SHIFT   = 1
%HOTKEYF_CONTROL = 2
%HOTKEYF_ALT     = 4
%HOTKEYF_EXT     = 8
'--------------------------------------------------------------------------------
TYPE LinkType
  zLinkFolder  AS ASCIIZ * %MAX_PATH 'Folder holding the .LNK file
  zLinkName    AS ASCIIZ * %MAX_PATH 'Shortcut .LNK file name
  zExeName     AS ASCIIZ * %MAX_PATH 'Target .exe path and name
  zArguments   AS ASCIIZ * %MAX_PATH 'Arguments
  zWorkDir     AS ASCIIZ * %MAX_PATH 'Working directory
  ShowFlag     AS DWORD              'Show flag: %SW_SHOWNORMAL %SW_MAXIMIZE %SW_SHOWMINIMIZED
  zComment     AS ASCIIZ * %MAX_PATH 'Comment
  zIconFile    AS ASCIIZ * %MAX_PATH 'Icon path, $NUL for current .exe icon
  IconIndex    AS DWORD              'Icon index, zero based
  zHotKey      AS ASCIIZ * 2         'Hotkey letter
  casHotKey    AS WORD               'Hotkey Control, Alt and Shift state: %HOTKEYF_SHIFT %HOTKEYF_CONTROL %HOTKEYF_ALT %HOTKEYF_EXT
END TYPE
'--------------------------------------------------------------------------------
FUNCTION ReadShortcut(BYVAL LnkPath AS STRING) AS STRING
 LOCAL  Link AS LinkType
 Link.zLinkName   = (PATHNAME$(NAMEX, LnkPath))
 Link.zLinkFolder = (PATHNAME$(PATH,  LnkPath))
 LinkQuery(Link)

 FUNCTION = "Link folder :"    & $TAB & Link.zLinkFolder                  & $CRLF & _
            "Link name :"      & $TAB & Link.zLinkName                    & $CRLF & _
            "Exe name :"       & $TAB & Link.zExeName                     & $CRLF & _
            "Arguments :"      & $TAB & Link.zArguments                   & $CRLF & _
            "Working folder :" & $TAB & Link.zWorkDir                     & $CRLF & _
            "Show flag :"      & $TAB & CHOOSE$(Link.ShowFlag, _
              "Normal", "Minimize", "Maximize", "NoActivate", "Show", _
              "Minimize", "MinNoActivate", "ShowNa", "Restore", "Default", _
              "ForceMinimize") & " (" & FORMAT$(Link.ShowFlag) & ")"      & $CRLF & _
            "Comment :"        & $TAB & Link.zComment                     & $CRLF & _
            "Icon file :"      & $TAB & $TAB & Link.zIconFile             & $CRLF & _
            "Icon index :"     & $TAB & FORMAT$(Link.IconIndex)           & $CRLF & _
            "Hotkey :"         & $TAB & $TAB & _
              IIF$((Link.casHotKey AND %HOTKEYF_SHIFT)  , "Shift "  , "") & _
              IIF$((Link.casHotKey AND %HOTKEYF_CONTROL), "Control ", "") & _
              IIF$((Link.casHotKey AND %HOTKEYF_ALT)    , "Alt "    , "") & _
              IIF$((Link.casHotKey AND %HOTKEYF_EXT)    , "Ext "    , "") & _
              Link.zHotKey
END FUNCTION
'--------------------------------------------------------------------------------
DECLARE FUNCTION F1(P1 AS ANY) AS DWORD
DECLARE FUNCTION F2(P1 AS ANY, P2 AS ANY) AS DWORD
DECLARE FUNCTION F3(P1 AS ANY, P2 AS ANY, P3 AS ANY) AS DWORD
DECLARE FUNCTION F4(P1 AS ANY, P2 AS ANY, P3 AS ANY, P4 AS ANY) AS DWORD
DECLARE FUNCTION F5(P1 AS ANY, P2 AS ANY, P3 AS ANY, P4 AS ANY, P5 AS ANY) AS DWORD
'--------------------------------------------------------------------------------
FUNCTION LinkQuery(BYREF Link AS LinkType)AS LONG
 LOCAL IID_Persist     AS GUID
 LOCAL CLSID_ShellLink AS GUID
 LOCAL IID_IShellLink  AS GUID
 LOCAL FileData        AS WIN32_FIND_DATA
 LOCAL zBuffer         AS ASCIIZ * %MAX_PATH
 LOCAL zBufferWide     AS ASCIIZ * %MAX_PATH * 2
 LOCAL PP              AS DWORD POINTER
 LOCAL PPF             AS DWORD POINTER
 LOCAL PSL             AS DWORD POINTER
 LOCAL Flags           AS DWORD
 LOCAL HotKey          AS DWORD
 LOCAL Retval          AS LONG

 CLSID_ShellLink = CHR$(001, 20, 2, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70)
 IID_IShellLink  = CHR$(238, 20, 2, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70)
 IID_Persist     = CHR$(011, 01, 0, 0, 0, 0, 0, 0, 192, 0, 0, 0, 0, 0, 0, 70)

 IF CoCreateInstance(CLSID_ShellLink, BYVAL NOTHING, 1, IID_IShellLink, PSL) = %S_OK THEN
   PP = @PSL : CALL DWORD @PP USING F3(BYVAL PSL, IID_Persist, PPF) TO Retval
   zBuffer =  Link.zLinkFolder & Link.zLinkName
   Retval = MultiByteToWideChar(%CP_ACP, 0, zBuffer, -1, BYVAL VARPTR(zBufferWide), (%MAX_PATH * 2))
   PP = @PPF + 20 : CALL DWORD @PP USING F3(BYVAL PPF, zBufferWide, BYVAL %True) 'SetIDList
   PP = @PSL + 12 : CALL DWORD @PP USING F5(BYVAL PSL, Link.zExeName, BYVAL %MAX_PATH, FileData, Flags) 'Get Path & zExeName
   IF LEN(Link.zExeName) THEN
     FUNCTION = %TRUE
     PP = @PSL + 24 : CALL DWORD @PP USING F5(BYVAL PSL, Link.zComment, BYVAL %MAX_PATH, FileData, Flags) 'Comment
     PP = @PSL + 32 : CALL DWORD @PP USING F5(BYVAL PSL, Link.zWorkDir, BYVAL %MAX_PATH, FileData, Flags) 'WorkDir
     PP = @PSL + 40 : CALL DWORD @PP USING F5(BYVAL PSL, Link.zArguments, BYVAL %MAX_PATH, FileData, Flags) 'Argument
     PP = @PSL + 48 : CALL DWORD @PP USING F2(BYVAL PSL, Hotkey) 'HotKey: %HOTKEYF_SHIFT=1 HOTKEYF_CONTROL=2  %HOTKEYF_ALT=4 % %HOTKEYF_EXT=8
     Link.zHotKey = CHR$(LO(WORD, Hotkey))
     Link.casHotKey = HI(BYTE, Hotkey)
     PP = @PSL + 56 : CALL DWORD @PP USING F2(BYVAL PSL, Link.ShowFlag) 'Show Normal-Maximize-Minimize
     PP = @PSL + 64 : CALL DWORD @PP USING F4(BYVAL PSL, Link.zIconFile, BYVAL %MAX_PATH, Link.IconIndex) 'External icon file and index
   END IF
   PP = @PPF + 8: CALL DWORD @PP USING F1( BYVAL PPF ) 'Release the persistant file
   PP = @PSL + 8: CALL DWORD @PP USING F1( BYVAL PSL ) 'Unbind the shell link object from the persistent file
 END IF

END FUNCTION
'--------------------------------------------------------------------------------