Function OpenAs_RunDLL最终在Windows 8下调用哪个函数?

Function OpenAs_RunDLL最终在Windows 8下调用哪个函数?,function,winapi,windows-8,executable,Function,Winapi,Windows 8,Executable,我试图使用OpenAs_RunDLLW让用户选择他想要打开特定文件的应用程序。但是我不想真正启动任何东西,只是让用户选择并记住他的选择,这样我以后就可以用这个程序打开文件。在Windows XP中,Vista和7 OpenAs_RunDLLW最终用于调用ShellExecuteExW,因此我可以临时将int 3操作码放在该函数的开头,捕获异常并将所有参数传递给ShellExecuteExW。这很好,真的很有效 但在Windows 8/8.1下,OpenAs_RunDLLW似乎不调用ShellEx

我试图使用OpenAs_RunDLLW让用户选择他想要打开特定文件的应用程序。但是我不想真正启动任何东西,只是让用户选择并记住他的选择,这样我以后就可以用这个程序打开文件。在Windows XP中,Vista和7 OpenAs_RunDLLW最终用于调用ShellExecuteExW,因此我可以临时将int 3操作码放在该函数的开头,捕获异常并将所有参数传递给ShellExecuteExW。这很好,真的很有效


但在Windows 8/8.1下,OpenAs_RunDLLW似乎不调用ShellExecuteExW,因为断点从未命中。此时将启动选定的应用程序。因此,我的问题是-OpenAs\u RunDLLW最终调用哪个API函数来执行Windows 8下的程序?

我相信shell现在用来打开该项。然而,你可能并不真的在乎这一点;您想要的是找到如何获取调用处理程序的方法


为此,您需要,它接受一个文件扩展名并返回一个(即,一个将枚举可以打开该扩展名的所有应用程序的函数)。

在Windows Vista和更高版本上,使用而不是调用
OpenAs\u RunDLL(),然后使用查找已注册的处理程序,并在需要时调用特定的处理程序,而不是使用
ShellExecute()

谢谢,SHAssocEnumHandlers确实提供了枚举器,但它缺少以下两个功能:1。我需要提供我自己的方式,让用户选择列表中未显示的其他应用程序。不过这不是什么大问题。2.IAssocHandler仅返回目标应用程序文件名,而不是完整的命令行。例如,目标应用程序被设计为与“-open”命令行开关一起使用-我不会得到它。@kde-IAssocHandler::Invoke(和iassochandlervoker::Invoke)不一定创建进程。但是,如果他们这样做,它看起来像是直接通过CreateProcess完成的。请尝试使用
ASSOCSTR_命令
标志来获取给定文件扩展名的完整命令行。@Remy Lebeau:这样,我将只获取默认的关联命令行,但我希望用户选择要使用的程序。Eric Brown:我将尝试在CreateProcessW上设置断点,谢谢。谢谢,SHOpenWithDialog完全消除了在shell32.dll中搜索过程地址的需要,但它引入了一些不兼容,因为Windows XP不支持它。由于它仍然无法返回所选的应用程序,我真的怀疑它的好处。关于ShassoceneumHandlers,请参阅我对上一篇文章的评论。