0

看似简单的任务:我想打开标准 Windows 对话框以选择用于打开文件的应用程序,然后等待该应用程序完成。互联网告诉 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,即使确实启动了新进程。

如何解决这个问题?提前致谢!

4

1 回答 1

1

shell 从来没有被设计成这样做,即使它不会 100% 工作,因为并非所有东西都会启动一个新进程(DDE、IShellExecuteHook、IDropTarget、IExecuteCommand 等)。

如果可以接受编写自己的对话框,那么您可能想看看IEnumAssocHandlers。Raymond Chen 最近发表了一篇关于它的博客文章

于 2015-12-14T18:07:45.180 回答