2014-05-04 72 views

回答

3

這是可能的話,你必須記住,控制檯鏈接目標是指使用控制檯自動創建的32位應用程序,它們與GUI相同,因此你會發現它是「自動創建的」,所以這意味着你可以手動執行相同的操作。

您可以使用GUI或帶有控制檯的GUI應用程序製作控制檯應用程序,它由您自己決定,我個人使用GUI製作控制檯應用程序,因爲您可以將GUI置入單獨的線程中,即使是確保控制檯始終存在,因此它可以讓您有機會捕捉致命錯誤。

下面是我自己的一個項目剪斷代碼,不正是你想要做什麼,但很相似

if (!AttachConsole(ATTACH_PARENT_PROCESS) ||\ 
     GetLastError()==ERROR_NOT_SUPPORTED ||\ 
     GetLastError()==ERROR_INVALID_HANDLE) 
    { 
     if (!AllocConsole()) 
     { 
// in this case we failed to alloc a console 
// fatal error? 
     } 
    } 
// at this point you already have a console or you created one 
    SetConsoleTitle("caption");  // you can set the console caption if you want to 
    freopen("CON","w",stdout); 
    SetConsoleOutputCP(CP_UTF8); // also this is needed when you want to use UTF8 

AttachConsole是當你要開始CMD.EXE您的應用程序的特殊情況或另一個控制檯應用程序,這意味着它會繼承控制檯,據我所知,你不能有多個控制檯,所以如果你的進程繼承了一個(你已經有一個)你不能分配一個新的控制檯,該函數將失敗沒有什麼會發生。如果你永遠不會在這種情況下運行你的應用程序,你不需要這個部分,所以我認爲這比這更復雜,因爲Visual Studio可以將你的控制檯輸出附加到它的日誌窗口,這意味着它實際上是一個漂亮的調試免費'工具。但我不確定它會不會奏效,從未嘗試過。

AllocConsole可能會失敗,因此您還應該檢查該情況,在該部分之後,您有自己的新控制檯或以某種方式從另一個應用程序繼承,並且這裏是最重要的部分!你必須重新打開stdout,以便系統知道stdout應該進入這個控制檯。

1

請嘗試以下方法生成一個控制檯,把它撿起來早就從別的地方,但不記得誰給信用:

static const WORD MAX_CONSOLE_LINES = 500; 
int hConHandle; 
long lStdHandle; 
CONSOLE_SCREEN_BUFFER_INFO coninfo; 
FILE *fp; 
// allocate a console for this app 
if(AllocConsole()) 
{ 
    // set the screen buffer to be big enough to let us scroll text 
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo); 
    coninfo.dwSize.Y = MAX_CONSOLE_LINES; 
    SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), 
     coninfo.dwSize); 
    // redirect unbuffered STDOUT to the console 
    lStdHandle = (long)GetStdHandle(STD_OUTPUT_HANDLE); 
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 
    fp = _fdopen(hConHandle, "w"); 
    *stdout = *fp; 
    setvbuf(stdout, NULL, _IONBF, 0); 
    // redirect unbuffered STDIN to the console 
    lStdHandle = (long)GetStdHandle(STD_INPUT_HANDLE); 
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 
    fp = _fdopen(hConHandle, "r"); 
    *stdin = *fp; 
    setvbuf(stdin, NULL, _IONBF, 0); 
    // redirect unbuffered STDERR to the console 
    lStdHandle = (long)GetStdHandle(STD_ERROR_HANDLE); 
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 
    fp = _fdopen(hConHandle, "w"); 
    *stderr = *fp; 
    setvbuf(stderr, NULL, _IONBF, 0); 
    // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog 
    // point to console as well 
    std::ios::sync_with_stdio(); 
} 
+0

什麼包括我需要使用,因爲VC++告訴我,_open_osfhandle和_O_TEXT未聲明 – MisterArch

+0

嘗試io.h&fcntl.h,抱歉關於延遲 – Ylisar

相關問題