代码之家  ›  专栏  ›  技术社区  ›  Andreas

如何用CreateProcess()模拟ShellExecute()

  •  0
  • Andreas  · 技术社区  · 5 年前

    *.jpg 文件 CreateProcess() CreateProcess() 确切地 与打开 具有 ShellExecute() .

    所以我先用 FindExecutable() *jpg先生 文件,然后连接查看器应用程序的路径和 文件,添加引号以确保它与其中包含空格的路径一起工作。

    然而,结果却不一样:在我的系统上 文件与具有轻量级查看器模式和更复杂的编辑器模式的应用程序相关联。当我使用 要打开文件(或在资源管理器中双击),查看器应用程序将以轻量级查看器模式打开。当我使用 然而,如上所述,查看器应用程序显示 *jpg先生 但它以编辑器模式打开。

    所以呢 一定是做了其他的事情,导致查看器应用程序的行为像它,但我不知道是什么。有没有什么好主意 举止一模一样 ?

    这是代码当前的样子:

    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);
    
    0 回复  |  直到 5 年前
        1
  •  3
  •   Community Egal    4 年前

    ShellExecute CreateProcess 但在它到达那里之前,它会做很多其他的事情。

    This blog post 作者:Raymond Chen提供了一个提示:

    FindExecutable函数来自16位窗口,在那个年代,没有 . (有DDE,但没关系,因为当没有人响应DDE消息时,程序仍然必须注册一个可执行文件才能在回退情况下使用。)

    ...

    新的应用程序无论如何都不应该使用FindExecutable,因为文件类型的处理程序甚至可能不是可执行文件。

    IContextMenu 基于shell的扩展可以是默认的,如果是,它可以做任何事情 只是告诉扩展调用命令。如果 SEE_MASK_INVOKEIDLIST 是否未指定?

    IExecuteCommand 和/或删除也执行实际执行的目标处理程序。

    将查找DDE注册,如果找到,将尝试使用DDE。

    如果其他都失败了, shell执行 创建进程

    shell执行 如果命令解析为需要UAC提升的可执行文件。

    让壳来处理剩下的。

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