久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

【答疑釋惑第三十六講】Windows下如何調(diào)試,?

 戢炧 2016-02-23


疑惑一
Windows窗口程序到底能不能用printf,?

很多小伙伴在控制臺(tái)下寫程序時(shí),要打印或者調(diào)試很方便,,用printf就可以直接打印輸出,,方便看結(jié)果,但是在編寫窗口程序時(shí),,由于窗口程序的子系統(tǒng)是Windows,,而不是控制臺(tái)的子系統(tǒng)console,因此非字符模式是不能用printf來(lái)輸出的,,那么到底在窗口模式下能不能用printf呢,?


答案是肯定的,但是需要我們自己創(chuàng)建一個(gè)控制臺(tái)終端,,可以用Windows提供的API函數(shù)AllocConsole來(lái)創(chuàng)建一個(gè)控制臺(tái),,以后的輸出都是在這個(gè)控制臺(tái)里操作。當(dāng)然只創(chuàng)建了控制臺(tái)還不行,,還得重定向輸入,、輸出和錯(cuò)誤輸出口,重定向有幾種方式:

最簡(jiǎn)單的就是用freopen函數(shù)綁定新的標(biāo)準(zhǔn)輸入輸出,,方法如下:
AllocConsole();
freopen('CONIN$', 'r', stdin);
freopen('CONOUT$', 'w', stdout);
freopen('CONOUT$', 'w', stderr);


如果只是想把printf的結(jié)束輸入文件,,可以直接把文件句柄賦給標(biāo)準(zhǔn)輸入:
FILE * fpin = fopen ('c://in.txt' ,'r' );
*stdin = *fpin;


最后一種就比較麻煩,就不多說(shuō)了,,下面的函數(shù)實(shí)現(xiàn)重定向:
void RedirectConsole(void)
{
DWORD hdl = (DWORD)GetStdHandle(STD_OUTPUT_HANDLE);
int hConHandle = _open_osfhandle(hdl, _O_TEXT);
_iobuf *fp = _tfdopen(hConHandle, TEXT('w'));
*stdout = *fp;
setvbuf(stdout, NULL, _IONBF, 0);

輸入關(guān)鍵printf獲取相關(guān)資料,,不懂得可以后臺(tái)繼續(xù)問(wèn)。


疑惑二
Windows窗口不用控制臺(tái)能不能打印調(diào)試信息

在窗口程序模式下,,要在終端打印只有按上面的方法進(jìn)行輸出,,其實(shí)只是調(diào)試看打印,,可以用Windows提供的API函數(shù)實(shí)現(xiàn)信息打印功能,只要在debug窗口下都可以看到,,而不需要像上面那樣分配一個(gè)控制臺(tái)窗口,。這個(gè)API就是OutputDebugString,該函數(shù)的參數(shù)是一個(gè)字符串,,他能把一個(gè)字符串輸出到調(diào)試窗口中,,可能用的伙伴就說(shuō)了,只能輸入文本串多沒(méi)意思,,要是能想printf那樣輸出任意類型的格式多好,。其實(shí)只要我們簡(jiǎn)單改裝一下就能到達(dá)跟printf函數(shù)一樣的結(jié)果,下面就是一個(gè)改裝好的函數(shù)參考:


void OutputDbgInfo(const TCHAR *format, ...)
{
TCHAR szData[512] = {0};
va_list arg;

va_start(arg, format);
_vsntprintf(szData, sizeof(szData)-1, format, arg);
va_end(arg);

OutputDebugString(szData);
}


大家從函數(shù)參數(shù)上也能看出來(lái),,實(shí)際上跟printf參數(shù)一樣,,能實(shí)現(xiàn)可變參數(shù)的任意格式了。

至于查看窗口,,VS就自帶debug窗口,,有人說(shuō)要是編譯好后脫離了VS環(huán)境怎么辦?剛才說(shuō)了,,只要是debug窗口就可以,,有不是只有VS才帶有debug窗口,比如有Dbgview這個(gè)小程序(網(wǎng)上可以下載)就可以接收并顯示調(diào)試信息,,你可以啟動(dòng)它來(lái)查看,。


疑惑三
WM_CLOSE,WM_DESTROY,,WM_QUIT有什么區(qū)別

WM_CLOSE消息:

該消息是在關(guān)閉應(yīng)用程序窗口時(shí)觸發(fā),,典型的就是當(dāng)你點(diǎn)擊應(yīng)用程序右上角的叉號(hào)時(shí)就會(huì)走到該消息處,該消息是關(guān)閉應(yīng)用程序時(shí)最先接收到,,因此這時(shí)可以阻止窗口關(guān)閉和退出應(yīng)用程序,,還可以用于提示保存、自動(dòng)保存等操作,。如果要退出應(yīng)用程序,,一般會(huì)調(diào)用DestroyWindow這個(gè)函數(shù),Windows默認(rèn)處理就是直接調(diào)用這個(gè)函數(shù),,該函數(shù)在關(guān)閉窗口后發(fā)送WM_DESTROY消息給應(yīng)用程序,。


WM_DESTROY消息:

該消息接收到時(shí)已經(jīng)將窗口從屏幕上關(guān)閉了,視覺(jué)上已經(jīng)看不到窗口,,雖然這個(gè)時(shí)候還能阻止應(yīng)用程序徹底退出,但是對(duì)于一個(gè)窗口應(yīng)用程序在主窗口都已經(jīng)關(guān)閉的情況下再不退出,,已經(jīng)沒(méi)有實(shí)際意義了,。一般這個(gè)時(shí)候主要是卸載一些全局句柄、釋放內(nèi)存和對(duì)象等操作。該消息最后一般會(huì)調(diào)用PostQuitMessage這個(gè)函數(shù),,該函數(shù)簡(jiǎn)單的投遞WM_QUIT消息對(duì)消息隊(duì)列中,。


WM_QUIT消息:

GetMessage在獲取其他任何消息,返回值都不是0,,唯獨(dú)這個(gè)消息,,獲取該消息后返回0,于是退出消息循環(huán),,最終WinMain主線程函數(shù)退出,,結(jié)束程序運(yùn)行。



聯(lián)盟推出答疑解惑系列,,如果有編程疑惑可按照如下格式:

答疑解惑+個(gè)人昵稱+具體問(wèn)題

輸入到微信公眾號(hào)里面,,具有代表性的問(wèn)題,聯(lián)盟將整理成文章發(fā)表

輸入sh獲取所有的答疑解惑文章,,或者點(diǎn)擊“閱讀原文

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多