2014-10-17 88 views
0

我重定向輸出和錯誤的DLL與重定向時不起作用。DLL輸出到stderr從父

std::cout << "cout\n"; 
std::cerr << "cerr\n"; 
fprintf(stdout,"stdout\n"); 
fprintf(stderr,"stderr\n"); 
fputs("fputs stdout\n",stdout); 
fputs("fputs stderr\n",stderr); 
system("echo system stdout"); 
system("echo system stderr 1>&2"); 

提供了以下輸出日誌文件:

cout 
cerr 
stdout 
stderr 
fputs stdout 
fputs stderr 
system stdout 
system stderr 

但是,當另一個DLL(與調用LoadLibrary打開)採用標準錯誤我不明白在日誌文件中任何東西。

我想念一些明顯的東西嗎?

+2

一個簡單的解釋,通常是正確的,是DLL是用自己的CRT構建的,或者正在使用它自己的CRT。你在你的EXE的副本中替換了stdout而不是DLL。如果無法控制DLL的構建,則依賴全局CRT狀態永遠不會成爲問題。 – 2014-10-17 08:36:46

+0

謝謝!你是對的,在改變代碼生成和運行時庫後,這兩個DLL的使用相同(一個使用靜態版本)。 – Tobias 2014-10-17 16:42:42

回答

1

這是完全合理的。您沒有重定向進程的標準句柄,只有DLL運行時的標準輸出和錯誤設備。另一個DLL似乎正在使用它自己的運行時實例。

基本上你是這樣做的錯誤方式。在創建流程時,您應該在流程級別重定向標準輸出和標準錯誤。