【问题标题】:Is my application runs from inside Visual Studio vs. by executing an EXE file我的应用程序是从 Visual Studio 内部运行还是通过执行 EXE 文件运行
【发布时间】:2019-04-06 08:54:13
【问题描述】:

由于我经常在 Microsoft Visual Studio 2017 内部/外部测试我的二进制文件,因此我想控制我的代码在 C/C++ 控制台项目中的行为。

  • 用于在 Release 模式下从 Visual Studio 中运行 .exe 时的代码。
  • 另一个当我从资源管理器中单击我的 .exe 时。

我应该使用什么标志或函数来了解我的 .exe 是否是从 Visual Studio 内部启动的。

我想要达到的是:

#if !_RELEASE
    system("pause"); // prevents auto shutdown of my .exe in Explorer
                     // double click
#endif

其中 _RELEASE 是在 Studio 启动时触发代码的某种特征, 但在资源管理器中双击不可见。

【问题讨论】:

标签: c++ visual-studio winapi


【解决方案1】:

我应该使用什么标志或函数来了解我的进程是否是从 Visual Studio 内部启动的。

  1. 您不应该从程序代码内部进行此类行为控制。这是一个糟糕的设计,并且会使您的程序代码变得混乱,这些决定应该留给调用者。
    我建议您是否需要程序的不同行为(例如,在后台运行或使用可见的 GUI),这应该通过例如控制。配置文件或命令行参数。
    您可以同时使用 Visual Studio 设置来指定 cmd 行参数,或者使用不同的配置文件,甚至两者的组合。

  2. 您似乎坚持要解决您的想法,如何以最佳方式解决这个问题:
    您可以使用 WINAPI 函数遍历您的父进程 ID,并检查其中之一是否与 "Visual Studio" 模块匹配。
    这是一个链接到该技术的问答:

【讨论】:

  • 1.它仍然不是答案,2. 使用父进程 ID 非常复杂,容易出错,而且解决方案过于庞大和混乱,我没有尝试围绕我的 exe 构建整个操作系统
  • @startup.maker 1. 解决您的问题。 2。很大,容易出错且混乱但我看不到另一种更简单的方法。因此我建议你做 1.
  • @startup.maker 此时,您想要的解决方案可能不存在,我怀疑您是否会从这个问题中得到更多。我建议您只需使用我们提供的解决方案即可。
  • @startup.maker 你甚至没有提议在代码中进行试验,那么你为什么期待代码中的解决方案?
【解决方案2】:

这并不完全是解决方案,但是:

Raymond Chen(Microsoft winapi guru*)在精神上最接近我所面临的问题,帮助我检测我在什么模式或环境下运行控制台会话。

How can I tell whether my console program was launched from Explorer or from a command prompt?

printf("this process = %d\n", GetCurrentProcessId());
DWORD count = GetConsoleProcessList(nullptr, 0);
if (count == 1) {
    printf("I'm the last one!\n");
    Sleep(2000);
}
else {
    printf("I'm not the last one! %d\n", count);
}

【讨论】:

  • 由于问题仍然存在,我很高兴看到任何 CODE 形式的解决方案。不在等距和反曲。记住我要求好的和优雅的代码解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2015-05-10
  • 1970-01-01
相关资源
最近更新 更多