c++ - 控制台程序完成后转换到命令提示符?

标签 c++ c windows console

我正在用 C 和 C++ 编写一些使用 Windows 控制台的可执行文件。
我试图让控制台在我的程序逻辑完成后不关闭......但不仅仅是暂停或等待,我希望它成为一个 cmd.exe 命令行控制台本身,准备接受新的提示.
基本上我希望通过双击或拖放来运行我的程序的行为相当于点击 winkey + r并运行:cmd /k "program.exe [list of drag+drop files if any]"(如果从命令行本身运行,则不会打开新控制台。)
这可能吗?
编辑

我一直在修补这个并找到了一个似乎有效的解决方案:std::getenv("PROMPT")将返回 0当不从命令行运行时(我认为无论如何,不​​确定是否在所有情况下都适用),因此可以根据可执行文件的运行方式来 fork 逻辑。
以下代码至少对我有用,在我有限的实验中。如果它是从资源管理器中运行的,它会使用它的第一个实例来调用 cmd.exe 并带有参数,让该实例再次使用原始参数调用我们的程序。

int main(int argc, char * argv[]) {
    // checks if we're in the explorer window, if so delegates to a new instance
    if (std::getenv("PROMPT") == NULL) {
        printf("Starting from explorer...\n");
        std::string str("cmd /Q /k \"");
        for (uint32 n = 0; n < argc; ++n) {
            str.append("\"");
            str.append(argv[n]);
            str.append("\"");
            if(n < argc-1)
                str.append(" ");
        }
        str.append("\"\n");
        system(str.c_str());
        return 0;
    }

    // actual code we want to run 
    uint32 fileCount = 0;
    for (uint32 n = 0; n < argc - 1; ++n) {
        fileCount++;
        printf("file %02u >> %s\n", n, argv[n+1]);
    }
    if (fileCount == 0) {
        printf("No inputs...\n");
    }
    return 0;
}
所以我想从概念上讲,它看起来像这样。
____stays open_______________________   __closes when finished___
program.exe [paramList] ---> cmd.exe -+-> program.exe [paramList]
                                      |
                                      +-> any subsequent commands
                                      |
                                     etc

最佳答案

您可以简单地插入该行system( "cmd" );在程序结束时,它将在程序执行完毕后调用命令提示符。
但是,这可能无法满足您的以下要求:

(While not opening a new console if run from a command-line itself.)


虽然使用 system( "cmd" );不会打开一个新的控制台窗口(它将使用现有的),它会创建一个新进程 cmd.exe ,这意味着您现在将拥有 2 cmd.exe如果您的程序被 cmd.exe 调用,则处理.还有,如果原来的cmd.exe process 由您自己的程序调用,那么您现在将有 2 个进程运行您的程序。如果您现在从这个新的命令提示符再次调用您的程序,您现在将拥有 3 cmd.exe进程和 3 个运行程序的进程。这可能会很快变得难看,尤其是当您从批处理文件中反复调用程序时。
为了防止这种情况,您的程序可以尝试以某种方式检测其父进程是否已经是 cmd.exe ,如果是,它应该正常退出而不是调用 cmd.exe再次。
不幸的是,Windows API 似乎没有为子进程提供任何官方方法来获取其父进程的进程 ID。然而,根据this page ,可以使用未记录的函数来完成此操作。
但是,通常不建议使用未记录的函数。因此,如果您总是从命令提示符调用您的程序可能会更好,这样它就可以正常退出。

关于c++ - 控制台程序完成后转换到命令提示符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68185472/

相关文章:

c++ - 使库函数使用从库类派生的类

c# - 计算与字符串中的模式匹配的标记数

c++ - 如何提取 char* 的子部分

c - snprintf : simple way to force . 作为基数?

c# - 如何按键查找/检查字典值

在c中复制文件夹

c++ - 访问者模式是否比受控使用 RTTI 更好?

c++ - OpenGL 变换具有不同轴多次旋转的对象

c - 链接中的多重定义

Python 设置禁用路径长度限制的优点和缺点?