2015-08-07 10 views
0

По-видимому простая задача: я хочу открыть стандартный диалог Windows для выбора приложения, которое будет использоваться для открытия файла, а затем дождаться завершения этого приложения. Интернет говорит, что ShellExecuteEx - это путь.Как реализовать команду «Открыть с помощью» с помощью ShellExecuteEx и дождаться ее завершения?

Итак, вот код:

SHELLEXECUTEINFO sei; 
    ::ZeroMemory(&sei,sizeof(sei)); 
    sei.cbSize = sizeof(sei);   
    sei.lpFile = L"path/to/document"; 
    sei.lpVerb = L"openas"; 
    sei.lpParameters = L""; 
    sei.nShow = SW_SHOW; 
    sei.fMask = SEE_MASK_NOCLOSEPROCESS | SEE_MASK_INVOKEIDLIST ; 
    BOOL ret = ::ShellExecuteEx(&sei); 
    DWORD waitResult = ::WaitForSingleObject(sei.hProcess, INFINITE); 

Но это не работает: с указанием флага SEE_MASK_INVOKEIDLIST делает hProcess всегда быть NULL, даже если новый процесс был действительно запущен.

Как это можно исправить? Заранее спасибо!

+3

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

+0

@ Давид: Спасибо за ответ! Хорошо, но можно ли получить ручку хотя бы в тех случаях, когда был использован новый процесс? –

+0

Я не знаю об этом –

ответ

1

Оболочка никогда не была предназначена для этого, и даже если бы это было, это не сработало бы 100% времени, потому что не все запускает новый процесс (DDE, IShellExecuteHook, IDropTarget, IExecuteCommand и т. Д.).

Если вы пишете свой собственный диалог, то можете взглянуть на IEnumAssocHandlers. Реймонд Чен недавно сделал об этом blog post.