Есть мое приложение, есть стороннее приложение. По команде пользователя мое ПО запускает стороннее ПО. Его наличие определяется по веткам реестра этого стороннего ПО. Если приложение не установлено (ветки в реестре отсутствуют), то команда запуска запрещена. И все как бы хорошо, но вот пользователи захотели, что бы мое ПО научилось находить стороннее ПО без использования записей в реестре, при этом exe файл этого стороннего ПО будет находится в одной из директорий, указанной в %PATH%. С запуском проблем не будет, CreateProcess "searches for the executable file in ... the directories that are listed in the PATH environment variable". Но для корректного UI мне нужно определить, что exe файл существует %PATH%. Как это можно сделать?
Re: Определить наличие exe файла в %PATH% директориях
Здравствуйте, Aniskin, Вы писали:
A>Как это можно сделать?
Записей в реестре нет -> никогда не запускаем A> Если приложение не установлено (ветки в реестре отсутствуют), то команда запуска запрещена.
Или я что-то не так понял? Решение принимается же когда твоё ПО работает?
Re: Определить наличие exe файла в %PATH% директориях
Здравствуйте, Aniskin, Вы писали:
A>Есть мое приложение, есть стороннее приложение. По команде пользователя мое ПО запускает стороннее ПО. Его наличие определяется по веткам реестра этого стороннего ПО. Если приложение не установлено (ветки в реестре отсутствуют), то команда запуска запрещена. И все как бы хорошо, но вот пользователи захотели, что бы мое ПО научилось находить стороннее ПО без использования записей в реестре, при этом exe файл этого стороннего ПО будет находится в одной из директорий, указанной в %PATH%. С запуском проблем не будет, CreateProcess "searches for the executable file in ... the directories that are listed in the PATH environment variable". Но для корректного UI мне нужно определить, что exe файл существует %PATH%. Как это можно сделать?
Поиском в путях %PATH%, ваш КЭП
Там делов-то — разбить PATH по ';', потом — FindFirstFile/FindNextFile. Делов на пять минут. Возможно, и есть какая-нибудь Sh* функция, но я ничего такого не припоминаю
Здравствуйте, CEMb, Вы писали:
CEM>Записей в реестре нет -> никогда не запускаем
Условно говоря, есть два сценария. В первом стороннее ПО устанавливается стандартно установщиком со всеми вытекающими в виде записей в реестре. Второй сценарий — стороннее ПО просто копируется, и путь, куда копируется, добавляется в %PATH%. Мне нужно обработать второй сценарий.
Re[2]: Определить наличие exe файла в %PATH% директориях
Здравствуйте, Marty, Вы писали:
M>Поиском в путях %PATH%, ваш КЭП
Логичненько.
Но вот какая штука. The system searches for the executable file in the following sequence:
1) The directory from which the application loaded.
2) The current directory for the parent process.
3) The 32-bit Windows system directory. Use the GetSystemDirectory function to get the path of this directory.
4) The 16-bit Windows system directory. There is no function that obtains the path of this directory, but it is searched. The name of this directory is System.
5) The Windows directory. Use the GetWindowsDirectory function to get the path of this directory.
6) The directories that are listed in the PATH environment variable.
%PATH% находится на последнем месте. А для унификации мне бы неплохо бы обрабатывать все 6 сценариев. А в Windows 10.2 возможно появится еще и седьмой, а к тому моменту возможно я уже помру и некому будет обновить мою программу
Re[3]: Определить наличие exe файла в %PATH% директориях
Здравствуйте, Aniskin, Вы писали:
A>Но вот какая штука. The system searches for the executable file in the following sequence:
A>1) The directory from which the application loaded. A>2) The current directory for the parent process. A>3) The 32-bit Windows system directory. Use the GetSystemDirectory function to get the path of this directory. A>4) The 16-bit Windows system directory. There is no function that obtains the path of this directory, but it is searched. The name of this directory is System. A>5) The Windows directory. Use the GetWindowsDirectory function to get the path of this directory. A>6) The directories that are listed in the PATH environment variable.
A>%PATH% находится на последнем месте. А для унификации мне бы неплохо бы обрабатывать все 6 сценариев. А в Windows 10.2 возможно появится еще и седьмой, а к тому моменту возможно я уже помру и некому будет обновить мою программу
Может, SearchPath — оно?
Если нет, могу предложить хак, покрывающий вроде всё, кроме The current directory for the parent process.
// если успешно, значит .exe есть
HMODULE module = LoadLibraryEx(_T("program.exe"), LOAD_LIBRARY_AS_DATAFILE | LOAD_LIBRARY_AS_IMAGE_RESOURCE);
// полный путь где нашлось
TCHAR path[MAX_PATH];
GetModuleFileName(module, path, MAX_PATH);
Полагается на то, что DLL ищутся именно в такой же последовательности, и что .exe может быть загружен как .dll
Для не-ехе (например, .bat файлов) работать не будет.
Русский военный корабль идёт ко дну!
Re[2]: Определить наличие exe файла в %PATH% директориях
M>Поиском в путях %PATH%, ваш КЭП M>Там делов-то — разбить PATH по ';', потом — FindFirstFile/FindNextFile. Делов на пять минут. Возможно, и есть какая-нибудь Sh* функция, но я ничего такого не припоминаю
Лучше по GetFileAttributes, если имя exe-шника известно.
const DWORD dwRes=GetFileAttributes(полный_путь_из_PATH + имя_exeшника - в общем полный путь к искомому файлу);
if ((DWORD)-1 == dwRes)
return здесь_файла_нет
else {
if (dwRes & FILE_ATTRIBUTE_DIRECTORY)
return есть_но_ПАПКА_а_не_файл
}
A>%PATH% находится на последнем месте. А для унификации мне бы неплохо бы обрабатывать все 6 сценариев. А в Windows 10.2 возможно появится еще и седьмой, а к тому моменту возможно я уже помру и некому будет обновить мою программу
А кто мешает 1) Сложить в вектор строк вышеприведенные 6 значений; 2) разбить PATH по ';' и также поместить их в вектор; 3) пробежаться по вектору в поисках файла
Можное еще тупо делать тестовый запуск, если запустилось (и долго работает) — прибивать пока никто не заметил, если CreateProcess вернул ошибку — значит опция запуска внешней программы не доступна.
Здравствуйте, Carc, Вы писали:
M>>Поиском в путях %PATH%, ваш КЭП M>>Там делов-то — разбить PATH по ';', потом — FindFirstFile/FindNextFile. Делов на пять минут. Возможно, и есть какая-нибудь Sh* функция, но я ничего такого не припоминаю C>Лучше по GetFileAttributes, если имя exe-шника известно.
SearchPath(GetEnvrironmentVariable("PATH")..)
Кстати хочу заметить что у ShellExecute'а (который юзается в пуск/выполнить и в cmd'шной start) несколько иной алгоритм поиска пути, дополнительно роющийся в реестре.
Как много веселых ребят, и все делают велосипед...