'-------------------------------------------------------------------------------- ' This is ReadShortcut.inc for PBWin9. Usage: ' ? ReadShortcut (PathToLnkFile) '-------------------------------------------------------------------------------- #INCLUDE ONCE "Win32Api.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 %Null, 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 '--------------------------------------------------------------------------------