標籤: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]_[中級]_[介面程式開啟控制台輸出-轉寄輸出到控制台]