[Windows]_[中級]_[介面程式開啟控制台輸出-轉寄輸出到控制台]

來源:互聯網
上載者:User

標籤:windows   介面程式   控制台輸出   dll   轉寄   

情境:

1. 開發Windows介面程式時,需要列印輸出,斷點在調試多線程程式有局限性,就是會干擾線程的優先順序,看不到正確的結果,往往就是斷點就沒事,

沒斷點程式就不能正常運行了。

2. 使用動態庫(靜態庫)時,出現問題時在Dll裡寫std::cout輸出資訊是必不可少的調試方法,特別對於多線程程式,誰先誰後暫停後的結果就會不一樣了。

有時候沒有動態庫的代碼時,也沒法對動態庫打斷點。 

3.  開啟控制台視窗後只能看到WIndows程式的輸出而無法看到Dll的輸出?

4. 直接改配置屬性-》連結器-》子系統為 控制台 (/SUBSYSTEM:CONSOLE) 是不現實的,因為我們開發的是介面程式。


方法1, 在輸出視窗查看列印日誌,使用函數:

void WINAPI OutputDebugString(  __in_opt  LPCTSTR lpOutputString);


方法2, 像Console程式那樣開啟控制台視窗,不需要OutputDebugString,為了查看std::cout, printf輸出, 添加代碼:

static void OpenConsole(){AllocConsole();  HANDLE   handle   =   GetStdHandle(STD_OUTPUT_HANDLE);    int   hCrt   =   _open_osfhandle((long)handle,_O_TEXT);    FILE   *   hf   =   _fdopen(   hCrt,   "w"   );    *stdout   =   *hf;    }
在 _tWinMain 的開始調用

#ifdef _DEBUGOpenConsole();#endif


結束時調用

#ifdef _DEBUGFreeConsole();#endif

問題來了


我們自己寫的Dll庫裡寫的std::cout輸出並沒有列印出來?

原因就是Dll和Windows使用的不是同一個執行階段程式庫,所以導致OpenConsole()對動態庫無效.

解決辦法就是有2個步驟要確認,介面和動態庫都需要同樣的配置:

1. 配置屬性-》常規-》MFC的使用: 在共用DLL中使用MFC


2. 配置屬性-》C/C++ -》代碼產生-》多線程調試 DLL(/MDd)




現在已經可以在控制台看到DLL的輸出了,解決,不謝.^-^


參考:

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



[Windows]_[中級]_[介面程式開啟控制台輸出-轉寄輸出到控制台]

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.