c++ - 控制台程序完成后转换到命令提示符?
问题描述
我正在用 C 和 C++ 编写一些使用 Windows 控制台的可执行文件。
我试图让控制台在我的程序逻辑完成后不关闭......但不仅仅是暂停或等待,我希望它本身成为一个 cmd.exe 命令行控制台,准备好接受新的提示.
本质上,我希望通过双击或拖放运行我的程序的行为等同于点击winkey + r
和运行:
cmd /k "program.exe [list of drag+drop files if any]"
(如果从命令行本身运行,则不会打开新控制台。)
这可能吗?
编辑
我一直在对此进行修补,并找到了一个似乎可行的解决方案:
std::getenv("PROMPT")
当不从命令行运行时将返回0
(我认为无论如何,不确定这是否适用于所有情况),因此可以根据可执行文件的运行方式来分叉逻辑。
在我有限的实验中,以下代码至少对我有用。如果它是从资源管理器中运行的,它会使用它的第一个实例来调用带有参数的 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" );
在您的程序结束时,它将在您的程序完成执行后调用命令提示符。
但是,这可能无法满足您的以下要求:
(如果从命令行本身运行,则不会打开新控制台。)
虽然 usingsystem( "cmd" );
不会打开一个新的控制台窗口(它将使用现有的),但它会创建一个新的进程cmd.exe
,这意味着cmd.exe
如果你的程序被调用,你现在将有 2 个进程cmd.exe
。此外,如果原始cmd.exe
进程是由您自己的程序调用的,那么您现在将有 2 个进程运行您的程序。如果您现在再次从这个新的命令提示符调用您的程序,您现在将有 3 个cmd.exe
进程和 3 个进程运行您的程序。这可能会很快变得丑陋,尤其是当您从批处理文件中反复调用程序时。
为了防止这种情况,你的程序可以尝试以某种方式检测它的父进程是否已经是cmd.exe
,如果是,它应该正常退出而不是cmd.exe
再次调用。
不幸的是,Windows API 似乎没有为子进程提供任何官方方法来获取其父进程的进程 ID。但是,根据此页面,可以使用未记录的功能来完成此操作。
但是,通常不建议使用未记录的函数。因此,如果你总是从命令提示符调用你的程序可能会更好,这样它就可以简单地正常退出。
推荐阅读
- android - 为什么 LayoutInflater 的功能不是静态的,即使它明确接受父/根?
- javascript - Leaflet fitbounds display:none (Bootstrap5 tabnav)
- reactjs - TSX 中的路由身份验证
- python - 这个 for 循环是否在做我认为它正在做的事情?计算连续的 1 和 -1
- azure-data-factory - 向 ADF 文本文件输出添加换行符(这可以通过逻辑应用程序或映射数据流来完成)吗?
- size - 大小点 R 图使用分类器的问题
- java - 如何在加载 json 数据或对象并开始新活动时显示加载屏幕?
- swift - 如何在@completion 函数中使用输入
- javascript - 使用带有 Spring 后端的 Node
- python - 我如何在函数中输入数据,因为它不起作用?