Winapi 如果ShellExecute由于C+中没有文件关联而失败,如何打开窗口的默认对话框+;?

Winapi 如果ShellExecute由于C+中没有文件关联而失败,如何打开窗口的默认对话框+;?,winapi,shellexecute,fileopendialog,Winapi,Shellexecute,Fileopendialog,只要文件具有正确的关联,我就可以使用windows ShellExecute函数毫无问题地打开文件 如果不存在关联,我希望使用默认的windows对话框打开文件: 这可能吗?如果是,如何执行?执行RUNDLL32 shell,OpenAs\u RunDLL path/to/file/to/open显示该对话框的方法是使用OpenAs动词 CoInitializeEx(NULL, COINIT_APARTMENTTHREADED|COINIT_DISABLE_OLE1DDE); SHELLEXE

只要文件具有正确的关联,我就可以使用windows ShellExecute函数毫无问题地打开文件

如果不存在关联,我希望使用默认的windows对话框打开文件:


这可能吗?如果是,如何执行?

执行
RUNDLL32 shell,OpenAs\u RunDLL path/to/file/to/open
显示该对话框的方法是使用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\U CLASSES\U ROOT\Unknown\shell\openas
下进行检查,您会发现这与在shell32中调用(未记录的)openas\U RunDLL导出相同。

只是不使用显式动词。使用像“open”这样的特定动词是一个很大的错误:

  • “打开”可能不是默认动词(例如,它可能是“播放”、“编辑”或“运行”)
  • “打开”可能不存在
将NULL作为动词传递是一种更为正确的方法。系统将自动选择最合适的动词:

  • 如果已设置,则将使用默认谓词
  • 如果未设置默认动词,则将使用“打开”动词
  • 如果没有默认动词和“打开”动词,将使用第一个动词
  • 如果未指定动词-系统将显示“打开方式”对话框
换句话说,简单

ShellExecute(0, NULL, 'C:\MyFile.StrangeExt', ...);
将显示“打开方式”对话框


如果你想做特定的动作,只能使用特定的动词。例如,“打印”、“探索”、“符文”。否则-只需传递nil。

使用ShellExecuteEx,“打开”动词。在Win7上工作,无法保证早期版本。谢谢,这似乎有效。然而,值得注意的是,任何ShellExecute函数的参考文档中都没有列出“openas”动词。@Darius:第一个链接中的文档提到了“openas”动词,尽管这只是顺便提一下。请注意,
openas\u RunDLL
没有文档记录,并且