2009-01-11 85 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(它是从开始 - >运行启动的进程的父级)没有控制台。

相关问题