Как открыть диалоговое окно по умолчанию для окна, если ShellExecute не удается из-за отсутствия связи файлов в C ++? - PullRequest
2 голосов
/ 16 июня 2011

Я могу использовать функцию Windows ShellExecute, чтобы открыть файл без проблем, при условии, что файл имеет правильную связь.

Если ассоциации не существует, я хотел бы использовать диалоговое окно по умолчанию для открытия файла:

image

Возможно ли это?Если так, то как?

Ответы [ 4 ]

6 голосов
/ 17 июня 2011

документированный способ , чтобы показать, что диалог должен использовать глагол openas.

CoInitializeEx(NULL, COINIT_APARTMENTTHREADED|COINIT_DISABLE_OLE1DDE);
SHELLEXECUTEINFO sei = { sizeof(sei) };
sei.fMask = SEE_MASK_NOASYNC;
sei.nShow = SW_SHOWNORMAL;
sei.lpVerb = "openas";
sei.lpFile = "C:\\yourfile.ext";
ShellExecuteEx(&sei);

Если вы отметите в HKEY_CLASSES_ROOT\Unknown\shell\openas, вы увидите, что это то же самое, что вызов (недокументированного) экспорта OpenAs_RunDLL в shell32.

1 голос
/ 16 июня 2011

Выполнить RUNDLL32 Shell32,OpenAs_RunDLL path/to/file/to/open

0 голосов
/ 12 марта 2015

Просто не используйте явный глагол.Использование определенного глагола, такого как «open», является большой ошибкой:

  • «open» может не быть глаголом по умолчанию (например, это может быть «play», «edit» или «run»)
  • 'open' может не существовать

Правильнее будет просто передать NULL как глагол .Система автоматически выберет наиболее подходящий глагол:

  • Будет использоваться глагол по умолчанию, если он установлен
  • Будет использоваться глагол «open», если глагол по умолчанию не установлен
  • будет использоваться первый глагол, если нет доступных по умолчанию и глаголов «open»
  • если глаголы не назначены - система выведет диалог «Открыть с помощью»

Другими словами, простой

ShellExecute(0, NULL, 'C:\MyFile.StrangeExt', ...);

покажет диалог «Открыть с помощью».

Используйте только специфический глагол, если вы хотите специфическое действие.Например, «печать», «исследовать», «runas».В противном случае - просто передайте ноль.

0 голосов
/ 17 января 2014
go with foolowing code you will get your solution-


public const uint SEE_MASK_INVOKEIDLIST = 12;//add this line in your code


CoInitializeEx(NULL, COINIT_APARTMENTTHREADED|COINIT_DISABLE_OLE1DDE);
SHELLEXECUTEINFO sei = { sizeof(sei) };
sei.nShow = SW_SHOWNORMAL;
sei.lpVerb = "openas";
sei.lpFile = "C:\\yourfile.ext";
sei.lfmask= SEE_MASK_INVOKEIDLIST;//add this line in your code
ShellExecuteEx(&sei);

SEE_MASK_INVOKEIDLIST this variable set "Verb" from presented system registry.
...