2013-01-17 163 views
2

應用程序決定/產生一個新的控制檯窗口(當動態鏈接時)在哪裏? 是否有一些定義或編譯指示我可能忽略了一些定義或編譯指示或默認運行時dll中標準行爲的一些變化?我不確定這些問題是否正確,請閱讀下面的背景資料並與我聯繫。我很高興每個微調都朝着正確的方向發展。MSVC2008 c/C++控制檯應用程序產生新的控制檯

背景: 控制檯應用程序(/ 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()中的第一個fprintf到stdout或stderr進入新的控制檯窗口,而不是到啓動應用程序的shell。

在我的第一次嘗試中,我構建了Visual Studio 2005(我們使用,直到最新版本的庫包)和2010(由dll-provider推薦)的應用程序。這些版本沒有產生控制檯,但是當內存被釋放時可能會崩潰,這可能是在不同版本的運行時中分配的。使用Dependency Walker我可以找到dll所鏈接的「主」運行時。 PS:Afaik與2個不同的運行時間鏈接足夠危險。但它比以前版本的dll-pack有所改進,其中包括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); 
} 

配置屬性> 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 

配置屬性>清單工具>命令行

/nologo /outputresource:"..\..\..\build\win32_release\inputinterfaces\.inter_612_1_32.exe;#1" 

我仍然有問題,即產生一個shell,並且stdout不能被重定向使用(即app.exe> test.txt)。所以文本「應用程序運行...」不會打印在啓動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" 

所以有一些視覺工作室沒有反映在它給出的命令行中。什麼和爲什麼? 我仍然無能,並仍然感激每一個提示。

解決方案: 有一個調試器配置爲該名稱的可執行文件。這就是爲什麼我有這種行爲:

  • inter_612_2_32.exe沒有子殼
  • intes_612_2_32.exe沒有子殼
  • inter_612_1_32.exe派生子殼
  • intes_612_1_32.exe沒有子殼

使用ProcessExplorer我發現,inter_612_1_32.exe是DbgHost.exe的子進程。不幸的是,我沒有遵循這一主導,忘記了這一點。

加載的Dll其實並不重要。問題是在註冊表中的項: HKEY_LOCAL_MACHINE \ SOFTWARE \微軟\的Windows NT \ CURRENTVERSION \圖像文件執行選項\ inter_612_1_32.exe

我猜的入口被DebugDiag資料,應用程序驗證或其他一些工具,但創造在工具的GUI中刪除時不會刪除。

感謝每個想到它的人。

回答

1

某些第三方DLL可能會調用FreeConsoleAllocConsole,這些效果可能與您描述的效果類似。如果在DllMain內對DLL_PROCESS_ATTACH完成,它會在輸入main()之前發生,這是您的項目依賴關係的庫。

似乎沒有與您的構建環境相關的替代解釋。

如果創建將使用LoadLibrary可疑DLL文件,而不是對他們的導入庫鏈接項目,您可以瞭解更多:如果他們中的一些(或他們依賴)在DllMain確實FreeConsoleAllocConsole,它會在發生致電LoadLibrary

+0

我遵循了你的建議並更新了我的問題。該dll似乎不是原因。 – Sascha