我的应用程序是从Visual Studio内部运行还是通过执行EXE文件运行

时间:2019-04-06 08:54:14

标签: c++ visual-studio winapi

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

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

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

我想实现的是:

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

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

2 个答案:

答案 0 :(得分:1)

  

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

  1. 您不应从程序代码内部进行此类行为控制。这是糟糕的设计,会使您的程序代码杂乱无章,应由调用者决定。
    我建议如果您需要程序的其他行为(例如在后台运行或使用可见的GUI),则应使用例如配置文件或命令行参数。
    您可以为Visual Studio设置和/或cmd行参数都指定cmd行参数,或者使用其他配置文件,甚至可以将两者结合使用。

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

答案 1 :(得分:-3)

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

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);
}