Как отобразить диалоговое окно «Открыть с помощью» для незарегистрированного расширения файла? - PullRequest
9 голосов
/ 10 февраля 2012

Я хочу позволить пользователю выбрать ассоциацию (открытую с) для незарегистрированного в данный момент расширения файла.

В настоящее время я говорю API, чтобы открыть файл с помощью ShellExecute, и он возвращает ERROR_NO_ASSOCIATION код ошибки.

Есть ли способ сообщить API, что он должен позволить пользователю выбрать новую ассоциацию?

Ответы [ 3 ]

11 голосов
/ 10 февраля 2012

Я использую

procedure ShellOpenAs(const AFileName: string; AHandle: HWND);
begin
  ShellExecute(AHandle, 'open', PChar('rundll32.exe'), PChar('shell32.dll,OpenAs_RunDLL ' + AFileName), nil, SW_SHOWNORMAL);
end;

Редактировать (вдохновлено комментариями Дэвида и https://stackoverflow.com/a/13229516/1431618): Можно опустить ShellExecute и RunDll32, вызвав OpenAs_RunDLL напрямую:

procedure OpenAs_RunDLL(hwnd: HWND; hinst: HINST; lpszCmdLine: LPSTR; nCmdShow: Integer); stdcall; external shell32;

procedure ShellOpenAs(AHandle: HWND; const AFileName: string);
begin
  OpenAs_RunDLL(AHandle, HInstance, PChar(AFileName), SW_SHOWNORMAL);
end;

Существует также SHOpenWithDialog в Windows Vista и более поздних версиях (мне интересно, что Microsoft написала точку входа, совместимую с RunDLL, но пока Vista не удосужилась предоставить обычный APIфункция.)

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

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

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

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

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

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

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

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

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

3 голосов
/ 17 января 2014

Переходя по следующему коду, вы получите решение -

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.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...