Описание функции


_WinAPI_PathFindOnPath

Возвращает полный путь файла найденного в окружении %PATH%

_WinAPI_PathFindOnPath(file$, *other_dir)

Параметры

file$ Файл без пути.
*other_dir Дополнительная папка, например текущая директория программы

Возвращаемое значение

Успех:Возвращает полный путь
Ошибка:Возвращает переданное имя файла, если не найдено

Пример

; функция на основе примера Пётра
; http://purebasic.mybb.ru/viewtopic.php?id=951#p9355
Procedure.s PathFind3(*pfile)
    Protected Dim Dirs.s(1)
    Protected Path.s{#MAX_PATH} = PeekS(*pfile)
    Dirs(0) = GetPathPart(ProgramFilename())
    PathFindOnPath_(@Path, @Dirs())
    ProcedureReturn Path
EndProcedure

Structure other_dirs
    *path
EndStructure

; это на x64 работает
Procedure.s PathFind(file$)
    Protected tmp$, tmp2$
    tmp2$ = WorkDir$
    Protected other_dirs.other_dirs
    other_dirs\path = @tmp2$
    tmp$ = Space(#MAX_PATH)
    PokeS(@tmp$, file$)
    If PathFindOnPath_(@tmp$, @other_dirs)
        file$ = tmp$
    EndIf
    ProcedureReturn file$
EndProcedure

; это на x64 падает, так как *other_dir должен быть массив путей
Procedure.s _WinAPI_PathFindOnPath(file$, *other_dir)
    Protected tmp$
    tmp$ = Space(#MAX_PATH)
    PokeS(@tmp$, file$)
    If PathFindOnPath_(@tmp$, @*other_dir)
        file$ = tmp$
    EndIf
    ProcedureReturn file$
EndProcedure

; Работает идеально, не учитывает текущий каталог с программой
Procedure.s PathFind2(file$)
    Protected tmp$
    tmp$ = Space(#MAX_PATH)
    PokeS(@tmp$, file$)
    If PathFindOnPath_(@tmp$, #Null)
        file$ = tmp$
    EndIf
    ProcedureReturn file$
EndProcedure

Define CurPath$ = GetPathPart(ProgramFilename())
Debug _WinAPI_PathFindOnPath("shell32.dll", @CurPath$)
Debug _WinAPI_PathFindOnPath("shell32.dll", #Null)