如何在 Windows 上从 C 中的另一个程序启动一个独立程序(在单独的控制台窗口中)?

Posted

技术标签:

【中文标题】如何在 Windows 上从 C 中的另一个程序启动一个独立程序(在单独的控制台窗口中)?【英文标题】:How to start an independent program(in a separate console window) from another program in C on Windows? 【发布时间】:2018-12-28 11:37:24 【问题描述】:

我在 Windows 上有一个 C 应用程序,它需要在某些情况下启动另一个应用程序。我已经能够使用以下代码行成功启动另一个应用程序,但第一个应用程序(父)和新应用程序(子)使用相同的窗口。我希望他们有单独的窗口。我该怎么做?

我启动子应用的代码是:

    char *app_path = "path\\my_app.exe";
    char *app_arg = "arg";
    if (-1 == _spawnl(P_NOWAITO, app_path,app_arg,NULL))
    
        printf_s("\nUnable to start the app. Error code %d", errno);
    
    else
    
        printf_s("\App started successfully.");
    

注意:子应用不是真正的子应用,除非它是由“父级”启动的。

【问题讨论】:

同一个窗口?!怎么会这样?可以发个截图吗? 这两个应用程序是否都在控制台窗口中运行? @usr2564301 是的。 好的,你的意思是两个进程的文本输出发生在同一个控制台窗口中。没什么可做的,但您也许可以使用参数/C path\\my_app.exe arg 生成cmd.exe,而不是直接生成app.exe @Ctx 它解决了它。你愿意把它写成答案,这样我就可以接受了吗? 【参考方案1】:

你可以这样启动你的程序:

char *cmd_args = "/C C:\\Users\\Administrator\\Desktop\\my_app.exe app_arg";

if (-1 == _spawnl(P_NOWAITO, "C:\\Windows\\System32\\cmd.exe", cmd_args,NULL))

    printf_s("\nUnable to start the app. Error code %d", errno);

else

    printf_s("\App started successfully.");

start 是一个 cmd-builtin,它将在新窗口中启动以下命令。

【讨论】:

您的示例实际上并未使用start system 结合start 使用会更简单,这样的效果是不等待子进程并且不会硬编码cmd.exe的路径(例如ComSpec 可能是不同的 shell,或者 SystemRoot 可能不是“C:\Windows”)。例如:system("start \"window title\" \"C:\\Users\\Administrator\\Desktop\\my_app.exe\" app_arg")。通常需要引用可执行路径,在这种情况下,由于start 解析其参数的简单方式,我们必须包含窗口标题。 或者,选择更复杂的路由直接调用CreateProcess,并带有标志CREATE_NEW_CONSOLE

以上是关于如何在 Windows 上从 C 中的另一个程序启动一个独立程序(在单独的控制台窗口中)?的主要内容,如果未能解决你的问题,请参考以下文章

在 Linux/OSX 上从 C 程序运行 matlab 编译的 dll 库

如何在 Vista 和 Windows 7 上从我的应用程序启动屏幕键盘

在 Windows 上从 Apache CGI 运行 gswin64c

如何在 Windows 8 现代应用程序上从视频流中抓取帧?

我可以在我的物理 iPhone 设备上从 VSCode (Windows) 测试我的 Flutter 应用程序吗?

如何在 wsl2 上从 python3 运行 Selenium ChromeDriver?