簡體   English   中英

重定向MFC GUI應用程序中使用的c ++ dll的控制台輸出

[英]Redirecting console output of c++ dll used in MFC GUI application

我有一個C ++ DLL通過使用printf或cout的控制台輸出報告大量有用的信息。 我將此dll鏈接到我在MFC中編寫的GUI應用程序,並希望訪問其輸出。

聽起來很簡單,是嗎? 好吧,經過幾個小時的互聯網搜索和實施幾個解決方案后,我感到很驚訝!

因此,可能需要一些關於應用程序的其他信息 我有一個巨大的主機應用程序,我無法訪問。 實際上,我正在編寫插件。 它在運行時鏈接我的插件dll(我猜想使用LoadLibrary())。 我的dll反過來使用外部dll我想要獲取的輸出。 這個dll通過相應的lib文件鏈接到我的靜態,因此CRT完成所有加載。

據我所知,任何應用程序(包括所有以任何方式加載的dll)都有單個stdout流(單個stdin和單個stderr)。 而那時候事情對我來說太復雜了。 我試圖重定向這個stdout流(顯然,對於整個應用程序/進程),在某些情況下它適用於我的DLL,但它仍然不適用於EXTERNAL DLL。 即如果我使用像cout << "Hey!";這樣的東西cout << "Hey!"; 從我的dll,我可以在文件中看到我重定向流。 但是,來自外部dll的同一個調用(是的,我有它的來源,但我真的不想改變它們)什么都不做。 上帝知道這個輸出在哪里完成。

我試過了:

  1. 好舊的freopen()技巧。 為我的dll工作,對外部dll沒有影響。
  2. WinAPI SetStdHandle()調用。 根本不起作用。 似乎在Win7上遇到了一些麻煩。
  3. AllocConsole() + _open_osfhandle() 與1.在控制台中查看我的輸出,看不到外部dll的輸出。
  4. cout.rdbuf()重新分配。 與3相同但僅適用於cout。

嗯,伙計們,我真的需要幫助。 好像我被卡住了: - /

附加信息:
主機應用程序,我的DLL和外部DLL是使用MSVS'05開發的。 所有dll都具有“在靜態庫中使用MFC”設置。 測試在Win7 x64下完成。 我確實擁有所有來源,但我無權更改它們。

您正在通過“在靜態庫中使用MFC”設置搞砸了IIRC。 設置/重新打開int(POSIX樣式)句柄將不起作用,因為您的DLL和您的應用程序都使用不同的/獨立的運行時庫。 解決方案:使用“在共享DLL中使用MFC”設置。 在Windows上使用靜態運行時庫因為這種問題而被延遲。

你試過_dup2嗎? MSDN文檔中的示例顯示了如何重定向stdout (我不知道這是否適用於Windows級別的庫或操作系統級別,因此它可能不適用於整個過程。)

當然,DLL也可能正在寫入stderr

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM