Я считаю, ASSOCF_OPEN_BYEXENAME:ASSOCSTR_EXECUTABLE
ищет HKEY_CLASSES_ROOT\Applications
.
ShellExecuteEx
выполняет поиск в "нормальных каталогах" и ключ путей к приложениям :
Поиск исполняемого файла приложения
Когда функция ShellExecuteEx
вызывается с именем исполняемого файла в его параметре lpFile, есть несколько мест, где функция ищет файл. Мы рекомендуем зарегистрировать ваше приложение в разделе реестра «Пути к приложениям». Это избавляет приложения от необходимости изменять системную переменную среды PATH.
Файл ищется в следующих местах:
Текущий рабочий каталог.
Только каталог Windows (подкаталоги не ищутся).
Каталог Windows \ System32.
Каталоги, перечисленные в переменной среды PATH.
- HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Windows \ CurrentVersion \ Пути к приложениям
(HKEY_CURRENT_USER также используется в последних версиях Windows)
Assoc API больше ориентирован на ассоциации файлов.
Если вы просто собираетесь выполнить файл, тогда вам нужно просто использовать ShellExecuteEx
. Если вы просто хотите найти полный путь, вы можете использовать некоторые вспомогательные функции, чтобы выполнить часть работы за вас:
FindExecutable
кажется многообещающим, но у него есть некоторые обходные пути совместимости , и он также найдет исполняемый файл, используемый для открытия зарегистрированных типов (c:\foo\bar.txt
может преобразоваться в c:\Windows\Notepad.exe
и т. Д., Поскольку он использует ASSOCSTR_EXECUTABLE
),
Если вы хотите автоматически искать расширения, такие как .exe и .bat, вы можете использовать PathResolve(..., PRF_REQUIREABSOLUTE|PRF_VERIFYEXISTS|PRF_TRYPROGRAMEXTENSIONS|PRF_DONTFINDLNK)
, но вы должны быть осторожны, чтобы строка поиска не содержала \
или :
.
Если вы хотите искать только файл .exe, вы должны вручную добавить расширение, если оно отсутствует, а затем вызвать PathFindOnPath(, NULL)
.
Ни одна из этих функций не выглядит в ключе App Paths, они не используют тот же порядок поиска, что и ShellExecuteEx
(system32 перед% windir%?), И они, скорее всего, ограничены MAX_PATH.
Если эти функции (или ваша собственная эквивалентная версия) не работают, вы можете проверить ключ App Paths. При чтении из реестра вы должны добавить .exe, если расширение отсутствует, и использовать вспомогательную функцию, например SHQueryValueEx
, которая будет расширять REG_EXPAND_SZ
строк.