整理一下,在 windows programming 的時候,如何使用 printf, 這類的 standard I/O (標準I/O) 來顯示訊息幫助開發?
原因
在 windows programming,使用 MFC 的標準 windows template 都沒有 console window 來幫助顯示開發訊息,當然可以使用 IDE 中 debug message, 但這邊提供另一種方式,因為個人偏好使用 printf 快速地傾印資訊。
解法
先貼一段程式碼,從網路上抄來的…
AllocConsole();
HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);
int hCrtOut = _open_osfhandle(/*(long)*/(intptr_t) handle_out, _O_TEXT);
FILE* hf_out = _fdopen(hCrtOut, "w");
setvbuf(hf_out, NULL, _IONBF, 1);
*stdout = *hf_out;
HANDLE handle_in = GetStdHandle(STD_INPUT_HANDLE);
hCrtIn = _open_osfhandle(/*(long)*/(intptr_t) handle_in, _O_TEXT);
FILE* hf_in = _fdopen(hCrtIn, "r");
setvbuf(hf_in, NULL, _IONBF, 128);
*stdin = *hf_in;
HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);
int hCrtOut = _open_osfhandle(/*(long)*/(intptr_t) handle_out, _O_TEXT);
FILE* hf_out = _fdopen(hCrtOut, "w");
setvbuf(hf_out, NULL, _IONBF, 1);
*stdout = *hf_out;
HANDLE handle_in = GetStdHandle(STD_INPUT_HANDLE);
hCrtIn = _open_osfhandle(/*(long)*/(intptr_t) handle_in, _O_TEXT);
FILE* hf_in = _fdopen(hCrtIn, "r");
setvbuf(hf_in, NULL, _IONBF, 128);
*stdin = *hf_in;
然後再補上 streaming(串流) 的關係圖
這樣搭配看 應該很好理解程式碼。
補充說明
Process / Windows 就是目前在開發的 GUI 程式。
*stdout / *stdin 就是 CRT(C Run Time) lib 中的標準輸入跟輸出的指標,系統制訂的。
Console window 是使用 Window API, AllocConsole() 所產生。
搭配使用 GetStdHandle() 來取得 console standard I/O handle, handle_in / handle _out。
透過 _open_osfhandle() 將 console standard input/output handle 轉換為 file handle。
再使用 fdopen() 的方式,把 file handle, hCrtIn / hCrtOut 轉換為 file description。
最後,把 file description, hf_in / hf_out assigned to *stdin / *stdout 。
這樣視窗開發時,使用 printf 都不是問題囉!
有問題再留言囉!謝謝。
沒有留言:
張貼留言