Я не могу использовать ShellExecute(Ex), но мне нужно обеспечить очень похожую функциональность.
Моя функция принимает строку «файл» и «аргументы». Из строки файла я извлекаю расширение (если оно доступно) и вызываю AssocQueryStringW. Конкретно:
rc = AssocQueryStringW(URL_SCHEME_FILE | ASSOCF_NOTRUNCATE,
ASSOCSTR_COMMAND,
extension,
verb,
execStr,
&execStrSize);
(глагол == «открыть»). Если расширение было зарегистрировано, будет возвращена строка данных, связанная с записью реестра: HKEY_CLASSES_ROOT/\Shell\Open\Command. Я подумал, что могу использовать FormatMessage для форматирования возвращаемой строки и моих аргументов. К сожалению, некоторые записи содержат (%*). IE.AssocFile.WEBSITE содержит %l (да, L в нижнем регистре, а не один (1). Я передаю эту информацию в CreateProcessAsUser. Есть ли функция/API Windows, которая будет форматировать эти «командные строки»?
Если нет, могу ли я зависеть от того, что %* является последним тестом в строке открытия оболочки и что не используются никакие другие аргументы, кроме %1 (имя файла)? Другими словами, могу ли я просто заменить %* строкой аргументов?
Мне нужно выполнить в контексте безопасности потока, а не процесса.
К вашему сведению, новый docs.microsoft.com не работает во многих отношениях. Нам нужно подтвердить все, что читается в онлайн-документах, непосредственно в файлах заголовков SDK (например, um/Shlwapi.h). Перечисление URL_SCHEME предназначено для ParseURL. Значение URL_SCHEME_FILE (9) численно эквивалентно ASSOCF_INIT_DEFAULTTOFOLDER | ASSOCF_INIT_NOREMAPCLSID.
Используйте флаг ASSOCF_INIT_UNKNOWN для отказа, если нет зарегистрированной ассоциации, вместо того, чтобы получить программу Windows 7+ «открыть с помощью».
Вы можете предварительно обработать шаблон с помощью SHEvaluateSystemCommandTemplate, но это не полная процедура обслуживания, которую вы ищете. Он более безопасно разделяет параметры lpApplicationName и lpCommandLine для использования с CreateProcess[AsUser]. Вам все равно придется вручную подставлять аргументы для вставки параметров.
Целевой файл — как если бы пользователь дважды щелкнул по файлу — это %1 (или %l, или %L, пережиток эпохи Windows 9x, функционально такой же). Уважайте, как это используется в командной строке. Остальные аргументы заменяются строкой %*.





Можете объяснить, почему нельзя использовать
ShellExecuteEx?