首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MSVC2008 c/c++控制台应用程序生成新控制台

MSVC2008 c/c++控制台应用程序生成新控制台
EN

Stack Overflow用户
提问于 2013-01-17 12:40:09
回答 1查看 654关注 0票数 2

应用程序在哪里决定/导致产生一个新的控制台窗口(当动态链接时)?在默认的运行时dll中,是否有一些定义或语用我可能忽略了,或者在标准行为上有一些变化?我不太确定这是正确的问题,请阅读下面的背景,并容忍我。我很高兴每一次朝着正确的方向前进。

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

我正在2008上构建那个c/c++控制台应用程序。应用程序动态地链接到非常混乱的大量dll。整个库包是由一个第三方提供的版本构建,没有调试信息。dll包包括msvcr90.dll (9.0.30729.1) msvcp90.dll (9.0.30729.1)和msvcr80.dll (8.0.50727.42)。

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

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

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

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

更新1:

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

代码语言:javascript
复制
#include <stdio.h>
#include <Windows.h>

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

配置属性> c/c++ >命令行:

代码语言:javascript
复制
/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

配置属性>链接器>命令行:

代码语言:javascript
复制
/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

配置属性>报表工具>命令行

代码语言:javascript
复制
/nologo /outputresource:"..\..\..\build\win32_release\inputinterfaces\.inter_612_1_32.exe;#1"

我仍然存在这样的问题,即生成一个shell,并且不能使用(即app.exe > test.txt)重定向stdout。所以文字“应用程序运行.”不在启动exe的同一外壳上打印。

我仍然一无所知,对每一个暗示都心存感激。

更新2:

我为命令行创建了一个批处理文件。如果我用它编译它,则exe将按预期工作。

代码语言:javascript
复制
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"

所以有些视觉工作室做的事情没有反映在它给出的命令行中。什么和为什么?我仍然一无所知,对每一个暗示都心存感激。

解决方案:有一个为这个可执行文件名配置的调试器。所以我才会有这种行为:

  • inter_612_2_32.exe no子壳
  • intes_612_2_32.exe no子壳
  • inter_612_1_32.exe产卵子壳
  • intes_612_1_32.exe no子壳

使用ProcessExplorer,我发现inter_612_1_32.exe是DbgHost.exe的一个子进程。不幸的是,我没有跟随这条线索,而忘记了这一点。

装载的Dlls实际上并不重要。问题是注册表中的一个条目: HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\图像文件执行Options\inter_612_1_32.exe

我想该条目是由DebugDiag、Application或其他工具创建的,但在工具的GUI中删除时不会删除。

感谢所有想过这件事的人。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-17 12:47:51

一些第三方dll可能调用FreeConsoleAllocConsole,这具有您所描述的效果。如果它是在DllMain for DLL_PROCESS_ATTACH中完成的,那么在为库输入main()之前就会发生这种情况,库是您的项目依赖项。

对于您的构建环境,似乎没有其他替代的解释。

如果您创建一个项目,该项目将对可疑的dll使用LoadLibrary,而不是针对它们的导入库进行链接,您可以了解更多:如果其中一些(或它们的依赖项)在DllMain中执行FreeConsoleAllocConsole,则在LoadLibrary调用期间会发生这种情况。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14379345

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档