2009-01-11 84 views

回答

13

好,最根本的區別是:

  • AllocConsole()將創建一個新的控制檯(和附加到它)
  • AttachConsole(ATTACH_PARENT_PROCESS /* -1 */)不會創建一個新的控制檯,它會附着於母公司現有的控制檯處理。

在第一種情況下,您將獲得一個全新的控制檯窗口,在第二種情況下,您將使用現有的控制檯窗口。

當然,如果你已經連接到控制檯(即,你是從cmd.exe的推出了一個控制檯程序)沒有太大的區別 - 你會用兩種API得到一個錯誤。

另外請注意,只是因爲你從控制檯分離並不意味着分離的控制檯將是有用的 - 例如,如果你從cmd窗口啓動控制檯進程,該窗口基本上阻塞,直到你的過程結束。

一些代碼一起玩:

int main(int argc, char* argv[]) 
{ 
    int ch; 
    BOOL bResult; 

    printf("default console\n"); 
    ch = getchar(); 

    bResult = FreeConsole(); 
    bResult = AllocConsole();  
    printf("AllocConsole()\n"); 
    ch = getchar(); 

    bResult = FreeConsole(); 
    bResult = AttachConsole(ATTACH_PARENT_PROCESS);  
    printf("AttachConsole(ATTACH_PARENT_PROCESS)\n"); 
    ch = getchar(); 

    return 0; 
} 
+1

可以在C#.NET來創建編譯成一個Windows程序(而不是一個控制檯程序)可執行文件的控制檯窗口? – configurator 2009-01-11 19:27:30

0

它已經有一段時間,因爲我用的WINAPI,但我擡頭the MSDN documentation,我沒能找到CreateConsole API函數。所以我的猜測是CreateConsole是遺留的東西,並已被AttachConsole取代。所以可能沒有區別,但CreateConsole可能已被棄用。

5

我不認爲有一個名爲CreateConsole功能,但有AllocConsole

假設這就是你的意思,我認爲不同的是AttachConsole(ATTACH_PARENT_PROCESS)可以return ERROR_INVALID_HANDLE如果父進程沒有控制檯。

嘗試,無論從命令提示符並開始運行該代碼 - >運行:

#include <windows.h> 
#pragma comment (lib, "user32.lib") 

int main() 
{ 
    BOOL b; 
    char msg[1024]; 

    b = FreeConsole(); 
    sprintf(msg, "%d", b); 
    MessageBox(NULL, msg, "FreeConsole", 0); 

    b = AttachConsole(ATTACH_PARENT_PROCESS); 
    sprintf(msg, "%d", b); 
    MessageBox(NULL, msg, "AttachConsole", 0); 

    return 0; 
} 

從命令提示符下運行時,將顯示含有1兩個消息框,這意味着兩個通話成功。從「開始」 - >「運行」運行時,第一個框中包含1,第二個框中包含0,表示僅第一次調用成功。第二個失敗,因爲explorer.exe(它是從開始 - >運行啓動的進程的父級)沒有控制檯。

相關問題