草庐IT

windows - MSVC2008 c/c++控制台应用程序产生了新的控制台

coder 2024-06-13 原文

应用程序在哪里决定/导致产生新的控制台窗口(动态链接时)?
默认运行时dll中是否有一些我可能忽略的定义或杂注或标准行为的某些更改?我不太确定这些是正确的问题,请阅读以下背景并接受我的意见。我为每一个朝着正确方向前进的人感到高兴。

背景:
控制台应用程序(/SUBSYSTEM:CONSOLE)在启动时会生成一个新的子控制台。使用相同来源和配置设置的其他应用程序则没有。唯一的区别(貌似)是所提供的3rd-party-dll。由于有了新的子控制台,我无法再重定向输出(app.exe> dump.txt)。重定向对于此应用程序至关重要。

我正在MS Visual Studio 2008上构建该c/c++控制台应用程序。该应用程序动态链接到许多凌乱的dll。整个库包由第3方作为发行版提供,没有调试信息。 dll包中包括msvcr90.dll(9.0.30729.1),msvcp90.dll(9.0.30729.1)和msvcr80.dll(8.0.50727.42)。

导致这种情况的原因似乎是非常全局的,因为在main()中第一个输出到stdout或stderr的fprintf转到新的控制台窗口,而不是启动应用程序的shell。

在我的第一次尝试中,我在Visual Studio 2005(直到最新版本的库包之前使用)和2010(由dll提供程序推荐)上构建了该应用程序。这些构建并没有生成控制台,但是当释放可能是在不同版本的运行时中分配的内存时,它们确实崩溃了。使用Dependency Walker,我可以找到dll链接到的“主”运行时。

PS:Afaik链接两个不同的运行时足够危险。但这是对dll-pack以前版本的改进,后者包含71、80、90个运行时dll的r,c和m变体。

PPS:我以前主要是在linux上开发的,所以我可能会犯一些非常基本的错误。请为我的无知事先接受我的歉意。

更新1:

遵循安东·科瓦连科(Anton Kovalenko)的建议,我删除了越来越多的图书馆。然后我删除了更多代码。最后我以:

#include <stdio.h>
#include <Windows.h>

int main(int _argc, char **_argv)
{
printf("application running ...\n");
fflush(stdout);
Sleep(2000);
exit(0);
}

配置属性> c/c++>命令行:
/Od /Ob2 /D "_MBCS" /FD /EHsc /MD /Fo"a4input_interface_6.12_1.dir\Release\\" /Fd"a4input_interface_6.12_1.dir\Release\vc90.pdb" /W3 /nologo /c /TC /errorReport:prompt

配置属性>链接器>命令行:
/OUT:"D:\sascha\svn\a4_devel\cmakebuild\build\win32_release\inputinterfaces\.inter_612_1_32.exe" /VERSION:0.0 /INCREMENTAL:NO /NOLOGO /MANIFEST /MANIFESTFILE:"a4input_interface_6.12_1.dir\Release\.inter_612_1_32.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /SUBSYSTEM:CONSOLE /DYNAMICBASE:NO /ERRORREPORT:PROMPT kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

配置属性> list 工具>命令行
/nologo /outputresource:"..\..\..\build\win32_release\inputinterfaces\.inter_612_1_32.exe;#1"

我仍然有问题,产生了一个 shell 并且无法使用(即app.exe> test.txt)重定向stdout。因此,文本“应用程序正在运行...”不会打印在启动exe的同一 shell 上。

我仍然一无所知,也为每一个提示而感激。

更新2:

我为命令行创建了一个批处理文件。如果我用它进行编译,则exe将按预期工作。
cl.exe /Od /Ob2 /D "_MBCS" /FD /EHsc /MD /Fo"a4input_interface_6.12_1.dir\Release\\" /Fd"a4input_interface_6.12_1.dir\Release\vc90.pdb" /W3 /nologo /c /TC /errorReport:prompt main.c

link.exe /OUT:"D:\sascha\svn\a4_devel\cmakebuild\build\win32_release\inputinterfaces\.inter_612_1_32.exe" /VERSION:0.0 /INCREMENTAL:NO /NOLOGO /MANIFEST /MANIFESTFILE:"a4input_interface_6.12_1.dir\Release\.inter_612_1_32.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /SUBSYSTEM:CONSOLE /DYNAMICBASE:NO /ERRORREPORT:PROMPT kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib a4input_interface_6.12_1.dir\Release\main.obj

mt.exe /manifest a4input_interface_6.12_1.dir\Release\.inter_612_1_32.exe.intermediate.manifest /nologo /outputresource:"D:\sascha\svn\a4_devel\cmakebuild\build\win32_release\inputinterfaces\.inter_612_1_32.exe";#1"

因此,Visual Studio所做的某些事情并未反射(reflect)在它提供的命令行中。什么,为什么?
我仍然一无所知,也为每一个提示而感激。

解决方案:
为此名称的可执行文件配置了一个调试器。这就是为什么我有这种行为:
  • inter_612_2_32.exe没有子 shell
  • intes_612_2_32.exe没有子 shell
  • inter_612_1_32.exe生成子 shell
  • intes_612_1_32.exe没有子 shell

  • 通过使用ProcessExplorer,我发现inter_612_1_32.exe是DbgHost.exe的子进程。不幸的是,我没有跟随那个线索而忘记了它。

    加载的Dll实际上并不重要。问题是注册表中的条目:
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\inter_612_1_32.exe

    我猜该条目是由DebugDiag,Application Verifier或某些其他工具创建的,但是在该工具的GUI中删除时并未删除。

    感谢所有考虑此事的人。

    最佳答案

    一些第三方dll可能正在调用FreeConsoleAllocConsole,它们具有您描述的效果。如果在DllMain中完成DLL_PROCESS_ATTACH的操作,则会在为您的项目依赖项的库输入main()之前发生。

    似乎没有与您的构建环境有关的替代解释。

    如果您创建一个将可疑dll使用LoadLibrary而不是链接其导入库的项目,则可以了解更多信息:如果其中一些(或它们的依赖项)在FreeConsole中执行了AllocConsoleDllMain,则将在LoadLibrary调用期间发生。

    关于windows - MSVC2008 c/c++控制台应用程序产生了新的控制台,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14379345/

    有关windows - MSVC2008 c/c++控制台应用程序产生了新的控制台的更多相关文章

    1. ruby - 在 Ruby 程序执行时阻止 Windows 7 PC 进入休眠状态 - 2

      我需要在客户计算机上运行Ruby应用程序。通常需要几天才能完成(复制大备份文件)。问题是如果启用sleep,它会中断应用程序。否则,计算机将持续运行数周,直到我下次访问为止。有什么方法可以防止执行期间休眠并让Windows在执行后休眠吗?欢迎任何疯狂的想法;-) 最佳答案 Here建议使用SetThreadExecutionStateWinAPI函数,使应用程序能够通知系统它正在使用中,从而防止系统在应用程序运行时进入休眠状态或关闭显示。像这样的东西:require'Win32API'ES_AWAYMODE_REQUIRED=0x0

    2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

      我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

    3. Ruby Readline 在向上箭头上使控制台崩溃 - 2

      当我在Rails控制台中按向上或向左箭头时,出现此错误:irb(main):001:0>/Users/me/.rvm/gems/ruby-2.0.0-p247/gems/rb-readline-0.4.2/lib/rbreadline.rb:4269:in`blockin_rl_dispatch_subseq':invalidbytesequenceinUTF-8(ArgumentError)我使用rvm来管理我的ruby​​安装。我正在使用=>ruby-2.0.0-p247[x86_64]我使用bundle来管理我的gem,并且我有rb-readline(0.4.2)(人们推荐的最少

    4. ruby-on-rails - 带 Spring 锁的 Rails 4 控制台 - 2

      我正在使用Ruby2.1.1和Rails4.1.0.rc1。当执行railsc时,它被锁定了。使用Ctrl-C停止,我得到以下错误日志:~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`gets':Interruptfrom~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.2/lib/spring/client/run.rb:47:in`verify_server_version'from~/.rvm/gems/ruby-2.1.1/gems/spring-1.1.

    5. ruby-on-rails - openshift 上的 rails 控制台 - 2

      我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

    6. ruby - 在 Windows 机器上使用 Ruby 进行开发是否会适得其反? - 2

      这似乎非常适得其反,因为太多的gem会在window上破裂。我一直在处理很多mysql和ruby​​-mysqlgem问题(gem本身发生段错误,一个名为UnixSocket的类显然在Windows机器上不能正常工作,等等)。我只是在浪费时间吗?我应该转向不同的脚本语言吗? 最佳答案 我在Windows上使用Ruby的经验很少,但是当我开始使用Ruby时,我是在Windows上,我的总体印象是它不是Windows原生系统。因此,在主要使用Windows多年之后,开始使用Ruby促使我切换回原来的系统Unix,这次是Linux。Rub

    7. ruby - 使用 `+=` 和 `send` 方法 - 2

      如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

    8. Vscode+Cmake配置并运行opencv环境(Windows和Ubuntu大同小异) - 2

      之前在培训新生的时候,windows环境下配置opencv环境一直教的都是网上主流的vsstudio配置属性表,但是这个似乎对新生来说难度略高(虽然个人觉得完全是他们自己的问题),加之暑假之后对cmake实在是爱不释手,且这样配置确实十分简单(其实都不需要配置),故斗胆妄言vscode下配置CV之法。其实极为简单,图比较多所以很长。如果你看此文还配不好,你应该思考一下是不是自己的问题。闲话少说,直接开始。0.CMkae简介有的人到大二了都不知道cmake是什么,我不说是谁。CMake是一个开源免费并且跨平台的构建工具,可以用简单的语句来描述所有平台的编译过程。它能够根据当前所在平台输出对应的m

    9. C51单片机——实现用独立按键控制LED亮灭(调用函数篇) - 2

      说在前面这部分我本来是合为一篇来写的,因为目的是一样的,都是通过独立按键来控制LED闪灭本质上是起到开关的作用,即调用函数和中断函数。但是写一篇太累了,我还是决定分为两篇写,这篇是调用函数篇。在本篇中你主要看到这些东西!!!1.调用函数的方法(主要讲语法和格式)2.独立按键如何控制LED亮灭3.程序中的一些细节(软件消抖等)1.调用函数的方法思路还是比较清晰地,就是通过按下按键来控制LED闪灭,即每按下一次,LED取反一次。重要的是,把按键与LED联系在一起。我打算用K1来作为开关,看了一下开发板原理图,K1连接的是单片机的P31口,当按下K1时,P31是与GND相连的,也就是说,当我按下去时

    10. 深度学习部署:Windows安装pycocotools报错解决方法 - 2

      深度学习部署:Windows安装pycocotools报错解决方法1.pycocotools库的简介2.pycocotools安装的坑3.解决办法更多Ai资讯:公主号AiCharm本系列是作者在跑一些深度学习实例时,遇到的各种各样的问题及解决办法,希望能够帮助到大家。ERROR:Commanderroredoutwithexitstatus1:'D:\Anaconda3\python.exe'-u-c'importsys,setuptools,tokenize;sys.argv[0]='"'"'C:\\Users\\46653\\AppData\\Local\\Temp\\pip-instal

    随机推荐