首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用ShellExecute()仿真CreateProcess()

如何用ShellExecute()仿真CreateProcess()
EN

Stack Overflow用户
提问于 2019-07-14 13:59:45
回答 1查看 349关注 0票数 0

我试图用*.jpg打开一个CreateProcess()文件,并且希望CreateProcess()的行为与用ShellExecute()打开*.jpg时完全一样。

因此,我首先使用FindExecutable()*.jpg文件获取查看器应用程序,然后将查看器应用程序的路径和*.jpg文件的路径连接起来,添加引号以确保它与其中有空格的路径一起工作。

但是,结果是不同的:在我的系统中,*.jpg文件与具有轻量级查看器模式和更复杂的编辑器模式的应用程序相关联。当我使用ShellExecute()打开文件(或在资源管理器中双击它)时,查看器应用程序将以轻量级查看器模式打开。然而,当我使用上面描述的CreateProcess()时,查看器应用程序也会显示*.jpg文件,但它是在编辑器模式下打开的。

因此,ShellExecute()一定在做其他事情,这会导致查看器应用程序表现得像它那样,但我不知道是什么原因。任何让CreateProcess()完全像ShellExecute()一样行为可能缺少的想法

这就是当前代码的样子:

代码语言:javascript
复制
PROCESS_INFORMATION piProcInfo;
STARTUPINFO siStartInfo;

memset(&piProcInfo, 0, sizeof(PROCESS_INFORMATION));
memset(&siStartInfo, 0, sizeof(STARTUPINFO));

siStartInfo.cb = sizeof(STARTUPINFO); 

CreateProcess(NULL, cmdline, NULL, NULL, TRUE, 0, NULL, NULL, &siStartInfo, &piProcInfo);
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-07-14 15:32:23

ShellExecute在内部使用CreateProcess,但在实现之前它还做了许多其他的事情。

雷蒙德·陈( Raymond )的这篇博客文章给出了一个提示:

Find Executable函数来自16位Windows,而在那个年代,没有上下文菜单外壳扩展或自定义删除目标。(有DDE,但没关系,因为当没有人响应DDE消息时,程序仍然必须注册一个可执行文件才能用于回退情况。) ..。 更新的应用程序无论如何不应该使用Find,因为文件类型的处理程序甚至可能不是可执行的.

基于IContextMenu的shell扩展可以是默认的,如果是的话,它可以做任何事情,ShellExecute只是告诉扩展调用命令。如果没有指定SEE_MASK_INVOKEIDLIST,则不执行此操作?

注册表中典型的静态谓词可以有IExecuteCommand和/或删除目标处理程序,这些处理程序也可以执行实际执行。

如果上述两种情况都不是真的,ShellExecute将查找DDE注册,如果找到,它将尝试使用DDE。

如果其他所有操作都失败,ShellExecute将在替换%1值后使用CreateProcess调用命令字符串。

即使您模拟了所有这些(包括所有未记录的细节和兼容性解决方案),如果命令解析为需要UAC提升的可执行文件,仍然必须调用ShellExecute

仅仅找出哪个动词是真正的默认值就够难的了,我建议您只使用ShellExecute并让shell来处理其余的内容。

如果您只是好奇,您可以查看任务管理器或Process中生成的命令行,看看自定义处理程序是否只是添加了一个特殊参数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57028058

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档