| 1 | ; #EXAMPLE# ===================================================================================================================== |
|---|
| 2 | MsgBox(0, "PathFindOnPath Example", _ |
|---|
| 3 | StringFormat( "Full path of notepad.exe:\n%s\n\n" & _ |
|---|
| 4 | "Find ntuser.dat in profile folder, using custom paths:\n%s", _ |
|---|
| 5 | _WinAPI_PathFindOnPath("notepad.exe"), _WinAPI_PathFindOnPath("ntuser.dat", @UserProfileDir) _ |
|---|
| 6 | )) |
|---|
| 7 | ; =============================================================================================================================== |
|---|
| 8 | |
|---|
| 9 | ; #FUNCTION# ==================================================================================================================== |
|---|
| 10 | ; Name...........: _WinAPI_PathFindOnPath |
|---|
| 11 | ; Description ...: Searchs for a file in the default system paths |
|---|
| 12 | ; Syntax.........: _WinAPI_PathFindOnPath($szFile, $aExtraPaths="", $szPathDelimiter=@LF) |
|---|
| 13 | ; Parameters ....: $szFile - Filename to search for |
|---|
| 14 | ; $aExtraPaths - Extra paths to check before any others. |
|---|
| 15 | ; $szPathDelimiter - Delimiter used to split $aExtraPaths if it's an non-empty string (StringSplit with flag 2). |
|---|
| 16 | ; Return values .: Success - Full path of found file |
|---|
| 17 | ; Failure - Unchanged filename, @error=1 |
|---|
| 18 | ; Author ........: Daniel Miranda (danielkza) |
|---|
| 19 | ; Modified.......: |
|---|
| 20 | ; Remarks .......: $aExtraPaths can contain a list of paths to be checked before any system defaults. |
|---|
| 21 | ; It can be an array or a string. If the former, it shall not have a count in it's first element. |
|---|
| 22 | ; If the latter, it will be split using $szPathDelimiter as the delimiter, that defaults to @LF. |
|---|
| 23 | ; Related .......: |
|---|
| 24 | ; Link ..........; @@MsdnLink@@ PathFindOnpath |
|---|
| 25 | ; Example .......; No |
|---|
| 26 | ; =============================================================================================================================== |
|---|
| 27 | |
|---|
| 28 | Func _WinAPI_PathFindOnPath(Const $szFile, $aExtraPaths = "", Const $szPathDelimiter=@LF) |
|---|
| 29 | Local $iExtraCount = 0 |
|---|
| 30 | If IsString($aExtraPaths) Then |
|---|
| 31 | If StringLen($aExtraPaths) Then |
|---|
| 32 | $aExtraPaths = StringSplit($aExtraPaths, $szPathDelimiter, 1+2) |
|---|
| 33 | $iExtraCount = UBound($aExtraPaths, 1) |
|---|
| 34 | EndIf |
|---|
| 35 | ElseIf IsArray($aExtraPaths) Then |
|---|
| 36 | $iExtraCount = UBound($aExtraPaths) |
|---|
| 37 | EndIf |
|---|
| 38 | |
|---|
| 39 | Local $tPaths, $tPathPtrs |
|---|
| 40 | If $iExtraCount Then |
|---|
| 41 | Local $szStruct = "" |
|---|
| 42 | For $path In $aExtraPaths |
|---|
| 43 | $szStruct &= StringFormat("wchar[%d];", StringLen($path)+1) |
|---|
| 44 | Next |
|---|
| 45 | |
|---|
| 46 | $tPaths = DllStructCreate($szStruct) |
|---|
| 47 | $tPathPtrs = DLLStructCreate(StringFormat("ptr[%d];", $iExtraCount+1)) |
|---|
| 48 | |
|---|
| 49 | For $i=1 To $iExtraCount |
|---|
| 50 | DLLStructSetData($tPaths, $i, $aExtraPaths[$i-1]) |
|---|
| 51 | DLLStructSetData($tPathPtrs, 1, DLLStructGetPtr($tPaths, $i), $i) |
|---|
| 52 | Next |
|---|
| 53 | DLLStructSetData($tPathPtrs, 1, Ptr(0), $iExtraCount+1) |
|---|
| 54 | EndIf |
|---|
| 55 | |
|---|
| 56 | Local $aRet = DLLCall("shlwapi.dll", "int", "PathFindOnPathW", _ |
|---|
| 57 | "wstr" , $szFile, _ |
|---|
| 58 | "ptr" , DLLStructGetPtr($tPathPtrs) _ |
|---|
| 59 | ) |
|---|
| 60 | If @error OR NOT $aRet[0] Then Return SetError(1, 0, $szFile) |
|---|
| 61 | |
|---|
| 62 | Return $aRet[1] |
|---|
| 63 | EndFunc |
|---|