Как отформатировать Registry->Shell->Open->Command (вывод из AssocQueryString)

Я не могу использовать 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 (имя файла)? Другими словами, могу ли я просто заменить %* строкой аргументов?

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

zett42 04.02.2019 22:30

Мне нужно выполнить в контексте безопасности потока, а не процесса.

Dweeberly 04.02.2019 22:34

К вашему сведению, новый docs.microsoft.com не работает во многих отношениях. Нам нужно подтвердить все, что читается в онлайн-документах, непосредственно в файлах заголовков SDK (например, um/Shlwapi.h). Перечисление URL_SCHEME предназначено для ParseURL. Значение URL_SCHEME_FILE (9) численно эквивалентно ASSOCF_INIT_DEFAULTTOFOLDER | ASSOCF_INIT_NOREMAPCLSID.

Eryk Sun 04.02.2019 22:52

Используйте флаг ASSOCF_INIT_UNKNOWN для отказа, если нет зарегистрированной ассоциации, вместо того, чтобы получить программу Windows 7+ «открыть с помощью».

Eryk Sun 04.02.2019 23:15

Вы можете предварительно обработать шаблон с помощью SHEvaluateSystemCommandTemplate, но это не полная процедура обслуживания, которую вы ищете. Он более безопасно разделяет параметры lpApplicationName и lpCommandLine для использования с CreateProcess[AsUser]. Вам все равно придется вручную подставлять аргументы для вставки параметров.

Eryk Sun 04.02.2019 23:17

Целевой файл — как если бы пользователь дважды щелкнул по файлу — это %1 (или %l, или %L, пережиток эпохи Windows 9x, функционально такой же). Уважайте, как это используется в командной строке. Остальные аргументы заменяются строкой %*.

Eryk Sun 04.02.2019 23:18
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
6
213
0

Другие вопросы по теме