VC 視窗應用程式中使用控制台輸出

2021-08-09 03:59:21 字數 3903 閱讀 7662

用了n多年的outputdebugstring作為除錯輸出資訊的方法,很順手,在vs2008中用起來也依然順手,vs2010亦然.

馬上2012了,我想如果真的有末日,就在末日來臨之前,讓我嘗試下與以往不同的方法,不要讓生命留下什麼遺憾.所以我就想能不能使用乙個控制台視窗來作為輔助的除錯資訊輸出視窗,甚至可以用它來接收一些控制命令,從而更靈活的控制程式的除錯呢?於是又乙個大膽的嘗試歷程開始了,和平常一樣,這個過程耗費了我近20多個小時生命,**了近3個左右的腦細胞,結果終於出來了,下面就分享給大家,為了讓大家節約近20多個小時生命和3個左右腦細胞的開支.

控制台應用在windows nt核心平台上,已經不再是傳統意義上的dos on windows了,而是純粹的另一類應用程式——console應用,也就是控制台應用.它雖然看上去和那個dos命令視窗很像,但是核心已經完全變了,它是純32位(或64位)的了,而且有很多更加強大的命令列工具採用這種形式來執行.

在nt核心中,其實命令列應用和普通的視窗應用之間,並沒有太大的本質上的區別,只是api層面的區別而已,兩者其實都需要建立和顯示視窗……還有更多的異同我就不再去總結了,一般的vc++開發人員應該早就爛熟於心了.

當今的時代是乙個融會貫通的年代了:opengl和directx可以互操作了,現代化妝術讓美與醜的界限消失了,據說科學家亦由此發現了恐龍滅絕的秘密,現代醫學則模糊了性別的界限,而平板也越來越像手機了,手機則越來越像電腦了,不一而足,這裡我也來講講如何跨越控制台應用和視窗應用間的所謂鴻溝,以順應時代的需求,所謂與時俱進嘛!

雖然從理論上講,控制台應用和視窗應用並無本質區別,但是二者的徹底融合還是需要些技巧的.當然控制台程式中顯示視窗,則是小菜一碟,也已經有例子了,本文就不在羅嗦了,這裡我們重點來看看視窗應用中如何嵌入控制台視窗.並可以用傳統的c庫函式進行輸入輸出操作.這也是為了讓廣大網友學習的那些標準輸入輸出知識能在視窗應用橫飛的年代中保值並增值.

因為是windows平台,所以遇到問題的第一解決方案就是搜尋api,只要找到乙個api,那麼在msdn中就可以找到一組api,運氣好的話還可以找到完整的例子.於是我開啟msdn,按照記憶輸入了console functions結果一無所獲,只好又從記憶深處搜尋乙個名為setstdhandle的api,找到了,忒好咧!找到了一組console functions,哈哈,發財啦!挨個搜尋了一下,居然沒有createconsole,鬱悶!於是返回setstdhandle看看它提示這個控制代碼怎麼來的,它說要createfile,哦,對了自己昏頭了,console嘛,就是要createfile建立嘛,字元裝置嘛,ok,看createfile,msdn上說,要建立控制台,那麼就用檔名conin$和conout$分別來建立輸入和輸出控制台,呵呵,啥也不說了,vs2008伺候!用嚮導建個最簡單的windows應用先,然後在_twinmain中呼叫createfile,執行,結果……啥也沒有!~!@#$%^&*

不怕,咱還有網際網路嘛,可是搜啥呢?算了還是搜conout$和conin$試試,呵呵,運氣不錯搜到了,有個哥們說bcb視窗應用中呼叫allocconsole然後呼叫freopen重開啟下conout$和conin$之後呼叫printf就行了.試了試,嗨,效果還真好.繼續深入,找到這組方法的unicode版wprintf實驗,結果啥也沒輸出,printf就行.納了悶了.最後發現,原來沒有設定標準庫的**頁,暈,呼叫setlocale(lc_all,」chs」);一切ok了.

緊接著又實驗了scanf,wscanf,多執行緒,一切正常,輸入輸出在視窗中和往常一樣方便.不多說了,直接上**吧:

// window and console.cpp : 定義應用程式的入口點。

// 以下巨集定義要求的最低平台。要求的最低平台

// 是具有執行應用程式所需功能的windows、internet explorer 等產品的

// 最早版本。通過在指定版本及更低版本的平台上啟用所有可用的功能,巨集可以

// 正常工作。

// 如果必須要針對低於以下指定版本的平台,請修改下列定義。

// 有關不同平台對應值的最新資訊,請參考msdn。

#ifndef winver                          // 指定要求的最低平台是windows vista。

#define winver 0x0600           // 將此值更改為相應的值,以適用於windows 的其他版本。

#endif

#ifndef _win32_winnt            // 指定要求的最低平台是windows vista。

#define _win32_winnt 0x0600     // 將此值更改為相應的值,以適用於windows 的其他版本。

#endif

#ifndef _win32_windows          // 指定要求的最低平台是windows 98。

#define _win32_windows 0x0410 // 將此值更改為適當的值,以適用於windows me 或更高版本。

#endif

#ifndef _win32_ie                       // 指定要求的最低平台是internet explorer 7.0。

#define _win32_ie 0x0700        // 將此值更改為相應的值,以適用於ie 的其他版本。

#endif

#define win32_lean_and_mean             // 從windows 頭中排除極少使用的資料

// windows 標頭檔案:

#include #include #include #include "resource.h"

#include #include #define max_loadstring 100

// 全域性變數:

hinstance hinst;                          // 當前例項

tchar sztitle[max_loadstring];            // 標題欄文字

tchar szwindowclass[max_loadstring];      // 主視窗類名

//handle g_hinput = null;

handle g_houtput = null;

// 此**模組中包含的函式的前向宣告:

atom              myregisterclass(hinstance hinstance);

bool              initinstance(hinstance, int);

lresult callback  wndproc(hwnd, uint, wparam, lparam);

int_ptr callback  about(hwnd, uint, wparam, lparam);

unsigned __stdcall inputoutputthread( void * );

int apientry _twinmain(hinstance hinstance,hinstance hprevinstance,lptstr lpcmdline,int ncmdshow)

hacceltable = loadaccelerators(hinstance, makeintresource(idc_windowandconsole));

handle hconsoleiothread = (handle)_beginthreadex(null,0,inputoutputthread,null,create_suspended,null);

//std::wcout<<"開始訊息迴圈!"《最後需要說明下,c++的cin/cout等標準輸入輸出物件也可以直接使用,效果和printf等c函式是一樣的,並且如果你確定專案中只使用c++方式的輸入輸出,那麼freopen都可以不呼叫了,只呼叫allocconsole即可.最後需要釋放下console,呼叫freeconsole即可.

另乙個問題就是,如果你關閉了控制台視窗,那麼整個程式也就退出了,偶還木有找到解決的方法,如果哪位知道解決方法,還望不吝賜教!

遮蔽控制台應用程式視窗

1 控制台應用程式一 有窗 main.cpp pragma comment linker,subsystem windows entry maincrtstartup int main int argc,char argv 2 控制台應用程式二 無窗 main.cpp pragma comment ...

如何遮蔽控制台應用程式的視窗?

眾所周知,控制台應用程式一般都會顯示乙個控制台視窗 虛擬dos視窗 但很多時候控制台程式的執行邏輯根本不需要與使用者進行互動,所以顯示這個難看的視窗純屬多餘,那麼如何將它遮蔽掉呢?下面我向大家介紹一種方法。作業系統裝載應用程式後,做完初始化工作就轉到程式的入口點執行。程式的預設入口點實際上是由連線程...

ArcEngine控制台應用程式

wbaolong原文 arcengine控制台應用程式 控制台應用程式相比其他應用程式,更加簡單,簡化了許多冗餘,可以讓我們更加關注於本質的東西。現在讓我們看一看arcgis engine的控制台應用程式吧!一 首先是許可繫結 1 執行時環境的繫結 esri.arcgis.runtimemanage...