Windows MSVC2008 c/c++;控制台应用程序生成新的控制台

Windows MSVC2008 c/c++;控制台应用程序生成新的控制台,windows,visual-studio-2008,console-application,msvcrt,Windows,Visual Studio 2008,Console Application,Msvcrt,应用程序在何处决定/导致生成新的控制台窗口(动态链接时)? 默认运行时DLL中是否有一些定义或pragma我可能忽略了,或者标准行为中是否有一些更改?我不太确定这些问题是否正确,请阅读下面的背景资料,并耐心听我说。我很高兴每一次朝着正确的方向推进 背景: 控制台应用程序(/SUBSYSTEM:console)在启动时生成一个新的子控制台。使用相同源和配置设置的其他应用程序不支持。唯一的区别(表面上)是提供的第三方DLL。由于新的子控制台,我无法再重定向输出(app.exe>dump.txt)。重

应用程序在何处决定/导致生成新的控制台窗口(动态链接时)? 默认运行时DLL中是否有一些定义或pragma我可能忽略了,或者标准行为中是否有一些更改?我不太确定这些问题是否正确,请阅读下面的背景资料,并耐心听我说。我很高兴每一次朝着正确的方向推进

背景: 控制台应用程序(/SUBSYSTEM:console)在启动时生成一个新的子控制台。使用相同源和配置设置的其他应用程序不支持。唯一的区别(表面上)是提供的第三方DLL。由于新的子控制台,我无法再重定向输出(app.exe>dump.txt)。重定向对于此应用程序至关重要

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

无论是什么原因,这似乎都是全局性的,因为main()中stdout或stderr的第一个fprintf将转到新的控制台窗口,而不是启动应用程序的shell

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

PS:针对2个不同运行时的Afaik链接已经足够危险了。但它比以前版本的dll包有所改进,后者包括71、80、90运行时dll的r、c和m变体

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

更新1:

按照安东·科瓦连科的建议,我砍掉了越来越多的图书馆。然后我删除了更多的代码。最后,我以:

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

int main(int _argc, char **_argv)
{
printf("application running ...\n");
fflush(stdout);
Sleep(2000);
exit(0);
}
配置属性>链接器>命令行:

/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
配置属性>清单工具>命令行

/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"
因此,VisualStudio所做的一些事情并没有反映在它提供的命令行中。什么和为什么? 我仍然不知所措,仍然感激每一个暗示

解决方案: 为此可执行文件的名称配置了调试器。这就是为什么我有这种行为:

  • 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、applicationverifier或其他工具创建的,但在该工具的GUI中删除时没有删除


感谢所有想到这一点的人。

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

似乎没有其他与构建环境相关的解释


如果您创建了一个项目,该项目将使用
LoadLibrary
来处理可疑的DLL,而不是针对其导入库进行链接,那么您可以了解更多信息:如果其中一些DLL(或其依赖项)在
DllMain
中使用了
FreeConsole
alloconsole
,这将发生在
LoadLibrary
电话中。

我听从了你的建议,更新了我的问题。dll似乎不是原因。