【发布时间】:2021-09-12 01:31:55
【问题描述】:
我正在用 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
【问题讨论】:
-
我很想知道是否有人对此有正确的答案。我怀疑答案实际上是 no - 实现这一点的预期方法是执行
cmd /k逻辑的包装应用程序。 -
你可以有一些类似于你的“程序”的东西实际上是一个调用实际
.exe的批处理脚本。并使用 stackoverflow.com/a/36663349/4442671 之类的东西来根据调用的位置正确运行。 -
抱歉,
std::getenv()不是 C,而是 C++。如果您正在编写 C++ 代码,最好不要使用不鼓励使用的 C 函数,例如printf(),如果您的问题与 C 语言相关,那么您最好不要使用命名空间(它们在 C 中不存在)请,澄清并且不要混合两种语言,否则你最终会以一个不可移植、不可维护的程序结束。当然,充分标记您的问题,因为它被标记为 C 和 C++(但您的代码仅是 C++,因为您在程序中使用命名空间)