2014-12-23 3 views
1

Я знаю команду окна эквивалентной «WhereIs» из этой статьи: https://superuser.com/questions/21067/windows-equivalent-of-whereisКак программно определить PATH для команды?

Но как выполнить тот же используя код? Есть ли API Windows?

+0

В каком языке программирования? –

+1

http://pinvoke.net/default.aspx/kernel32/SearchPath.html –

ответ

2

Этот пример кода в C#, с помощью Linq, показывает, как проверить переменную PATH среды:

static string SearchEnvPathForProgram(string filename) 
    { 
     return Environment.GetEnvironmentVariable("PATH").Split(';') 
       .Select(dir => Path.Combine(dir, filename)) 
       .FirstOrDefault(path => File.Exists(path)); 
    } 

Однако, в случае, если это не является достаточным для вас, и вы должны имитировать полное поведение CreateProcess функции ядра Windows, вы должны расширить эту функцию, добавив другие места, перечисленные в комментарии @HarryJohnston (спасибо за замечание).

Например, folder of your current executable, current directory, или windows system directory. Думаю, вы найдете для каждого соответствующий вопрос здесь, на SO.

+0

Алгоритм использования Windows более сложный; например, сначала проверяется каталог приложения, за которым следует текущий каталог. Путь находится внизу списка, на шестом месте. Полная информация в [документации для CreateProcess] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425 (v = vs.85) .aspx). –

0

LoadLibraryEx, за которым следует GetModuleFileName, является одним из вариантов, хотя он будет работать только в том случае, если имя файла, которое вы ищете, включает расширение .exe.

Если включен безопасный режим поиска DLL (который по умолчанию используется в современных версиях Windows), сначала необходимо вызвать SetDllDirectory, передав текущий каталог в качестве аргумента. Не забудьте позвонить по телефону SetDllDirectory(NULL), чтобы восстановить поведение по умолчанию.

Это может быть небезопасно в многопоточной программе, поскольку другой поток может загружать DLL, в то время как безопасный режим поиска отключен.

+0

Можно ли вызвать 'CreateProcess' с' CREATE_SUSPENDED' и определить путь к исполняемому файлу из дескриптора процесса? –

+0

Ум ... может быть. Вы можете получить путь от дескриптора процесса, используя 'GetModuleFileNameEx', но я не совсем уверен, будет ли это работать с процессом, который еще не запущен. –

Смежные вопросы