【问题标题】:C++ program runs in background without admin rightsC++ 程序在没有管理员权限的情况下在后台运行
【发布时间】:2020-03-28 08:17:58
【问题描述】:

我试图删除在使用常规 main 函数启动 c++ 程序时打开的控制台窗口,并在编译调试时仍然保留它,以便我可以将输出发送到控制台。 为了测试这一点,我使用了一个使用 OpenGL 4.6 编写的简单引擎。

我最终做的是这个(我使用的是 windows 和 msvc 编译器):

  • 使用编译器选项/DDEBUG编译调试版

  • 如果未设置调试标志,则在我的主源文件中添加 /SUBSYSTEM:windows /ENTRY:mainCRTStartup 的编译指示。

#ifndef DEBUG
  #pragma comment(linker, "/SUBSYSTEM:windows /ENTRY:mainCRTStartup")
#endif

现在最终发生的事情是,在调试模式下一切正常,但在发布模式下,我的应用程序窗口不显示,它只是创建了一个在后台运行的进程,我必须手动杀死它。 如果我以管理员身份运行它,该应用程序在发布模式下运行良好。

因此问题:

为什么它在发布模式下需要管理员权限(无终端),但在终端中不需要管理员权限? 我该如何解决这个问题?我宁愿我的应用程序不需要管理员权限才能运行。

【问题讨论】:

  • 你能不能把#ifndef DEBUG去掉,这样你就有了和Release一样的应用程序,然后尝试调试应用程序?当没有管理员权限时,由于控制台不存在,可能 OpenGL 会抛出一些您看不到的错误
  • 这通常被认为是错误的形式——你的程序不需要决定这个;你启动程序的方式可以。
  • @RoQuOTriX 这是个好主意,我会试试的。
  • @UKMonkey 对不起,但我无法从您的评论中找出什么是不好的形式。
  • @DJSchaffner 让您的二进制文件决定如何处理控制台。如果从控制台运行会发生什么?你期望会发生什么?正确的做法是,与其尝试更改程序来控制它的启动方式,不如先找到启动程序的方式,然后再进行更改。

标签: c++ windows opengl compilation


【解决方案1】:

您的定义需要_NDEBUG,但似乎有更好的方法来解决这个问题。

您应该保留默认的 wWinMain 入口点,而不是 UCRT 入口点,所有参数都移动了一位。所以试试这个,而不是写到控制台:

在子系统设置为WINDOWS 的情况下继续编译,并删除/ENTRY 标志。请改用wWinMain。添加此项以打开控制台。

AllocConsole();
freopen("CONIN$", "r", stdin);
freopen("CONOUT$", “w”, stdout);
freopen("CONOUT$", "w", stderr);

wprintf(L"Console out write command.\r\n");

【讨论】:

  • 我使用 UCRT 入口点只保留常规主函数,而不是使用 Windows 特定选项。没有跨平台的解决方案吗?如果您的解决方案有效,我会尝试,但它看起来真的很“hacky”
  • 那么在这种情况下,您可以将“/ENTRY”设置为“CONSOLE”并在启动时使用“ShowWindow(GetConsoleWindow(), SW_HIDE):”隐藏控制台窗口:
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-21
相关资源
最近更新 更多