full credit for this goes to florent heyworth and george bleck as their getlinkinfo() function is at the heart of this pb/cc program that simply looks for all .lnk files in the path specified in command$ and then stdout's the shortcuts that theyre pointing to
[this message has been edited by wayne diamond (edited june 25, 2001).]
Code:
[b]'listlnks.bas[/b] #compile exe "listlnks.exe" #include "win32api.inc" declare function coinitialize lib "ole32.dll" alias "coinitialize"( byval pvreserved as dword ) as dword declare function cocreateinstance lib "ole32.dll" alias "cocreateinstance"( rclsid as string * 16, byval punkouter as any, byval dwclscontext as dword, riid as string * 16, ppv as dword ) as dword declare sub couninitialize lib "ole32.dll" alias "couninitialize" declare sub cotaskmemfree lib "ole32.dll" alias "cotaskmemfree"( pv as dword ) declare function sub1( p1 as any ) as dword declare function sub2( p1 as any, p2 as any ) as dword declare function sub3( p1 as any, p2 as any, p3 as any ) as dword declare function sub5( p1 as any, p2 as any, p3 as any, p4 as any, p5 as any ) as dword sub getlinkinfo( linkpath as string ) 'by florent heyworth and george bleck 'modified to exclude unnecessary shelllink variables, 'please see original at [url="http://www.powerbasic.com/support/pbforums/showthread.php?t=23774"]http://www.powerbasic.com/support/pbforums/showthread.php?t=23774[/url] local clsctx_inproc_server as dword local clsid_shelllink as string * 16 local filedata as win32_find_data local flags as dword local iid_ishelllink as string * 16 local iid_persist as string * 16 local lresult as dword local outvalue as asciiz * 128 local pp as dword ptr local ppf as dword ptr local psl as dword ptr local tmpasciiz as asciiz * %max_path local tmpwide as asciiz * ( 2 * %max_path ) clsid_shelllink = mkl$( &h00021401 ) + chr$( 0, 0, 0, 0, &hc0, 0, 0, 0, 0, 0, 0, &h46 ) iid_ishelllink = mkl$( &h000214ee ) + chr$( 0, 0, 0, 0, &hc0, 0, 0, 0, 0, 0, 0, &h46 ) iid_persist = mkl$( &h0000010b ) + chr$( 0, 0, 0, 0, &hc0, 0, 0, 0, 0, 0, 0, &h46 ) clsctx_inproc_server = 1 if isfalse( cocreateinstance( clsid_shelllink, %null, clsctx_inproc_server, iid_ishelllink, psl )) then pp = @psl: call dword @pp using sub3( byval psl, iid_persist, ppf ) to lresult tmpasciiz = linkpath multibytetowidechar %cp_acp, 0, tmpasciiz, - 1, tmpwide, %max_path pp = @ppf + 20: call dword @pp using sub3( byval ppf, tmpwide, byval %true ) 'getfilepath pp = @psl + 12: call dword @pp using sub5( byval psl, outvalue, byval %max_path, filedata, flags ) if trim$(outvalue) <> " then stdout outvalue exit sub end if end sub sub findlnkfiles(path as string) on error resume next local wfd as win32_find_data local flname as string ' walking filename variable... local dirname as string ' subdirectory name redim dirnames(0) as local string ' array for sub directories local ndir as long ' number of directories in this path local hsearch as long ' search handle local cnt as long ' for a counter in for/next loop local fres as integer ' for a true or false -flag local curpath as asciiz * %max_path 'for the findfirstfile calls if right$(path, 1) <> "\" then path = path & "\" curpath = path & "*.*" hsearch = findfirstfile(curpath, wfd) if hsearch <> %invalid_handle_value then 'get subdirectories fres = %true do while fres dirname = rtrim$(wfd.cfilename, chr$(0)) if (wfd.dwfileattributes and 16) = 16 then 'directory if asc(wfd.cfilename) <> 46 then 'not . or .. if ndir mod 50 = 0 then redim preserve dirnames(ndir + 50) dirnames(ndir) = dirname incr ndir end if else 'file flname = rtrim$(wfd.cfilename, chr$(0)) if lcase$(right$(flname,4)) = ".lnk" then '*** display the lnk file: 'stdout path & flname '*** display the shortcut location getlinkinfo path & flname end if end if fres = findnextfile(hsearch, wfd) 'get next subdirectory loop fres = findclose(hsearch) else exit sub end if if ndir then 'if there were any sub-directories.. for cnt = 0 to ndir - 1 call findlnkfiles(path & dirnames(cnt) & "\") next cnt end if end sub function pbmain() as long on error resume next local cmd$ cmd$ = command$ if trim$(cmd$) = " then stdout "usage: listlnks <path>" stdout " eg. listlnks c:\winnt\profiles" exit function end if coinitialize %null if right$(cmd$,1) <> "\" then cmd$ = cmd$ & "\" call findlnkfiles(cmd$) couninitialize end function
[this message has been edited by wayne diamond (edited june 25, 2001).]
Comment