Я знаю команду окна эквивалентной «WhereIs» из этой статьи: https://superuser.com/questions/21067/windows-equivalent-of-whereisКак программно определить PATH для команды?
Но как выполнить тот же используя код? Есть ли API Windows?
Я знаю команду окна эквивалентной «WhereIs» из этой статьи: https://superuser.com/questions/21067/windows-equivalent-of-whereisКак программно определить PATH для команды?
Но как выполнить тот же используя код? Есть ли API Windows?
Этот пример кода в 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.
Алгоритм использования Windows более сложный; например, сначала проверяется каталог приложения, за которым следует текущий каталог. Путь находится внизу списка, на шестом месте. Полная информация в [документации для CreateProcess] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425 (v = vs.85) .aspx). –
LoadLibraryEx
, за которым следует GetModuleFileName
, является одним из вариантов, хотя он будет работать только в том случае, если имя файла, которое вы ищете, включает расширение .exe
.
Если включен безопасный режим поиска DLL (который по умолчанию используется в современных версиях Windows), сначала необходимо вызвать SetDllDirectory
, передав текущий каталог в качестве аргумента. Не забудьте позвонить по телефону SetDllDirectory(NULL)
, чтобы восстановить поведение по умолчанию.
Это может быть небезопасно в многопоточной программе, поскольку другой поток может загружать DLL, в то время как безопасный режим поиска отключен.
Можно ли вызвать 'CreateProcess' с' CREATE_SUSPENDED' и определить путь к исполняемому файлу из дескриптора процесса? –
Ум ... может быть. Вы можете получить путь от дескриптора процесса, используя 'GetModuleFileNameEx', но я не совсем уверен, будет ли это работать с процессом, который еще не запущен. –
В каком языке программирования? –
http://pinvoke.net/default.aspx/kernel32/SearchPath.html –