当前位置:  开发笔记 > 编程语言 > 正文

API函数AllocConsole和AttachConsole(-1)之间有什么不同?

如何解决《API函数AllocConsole和AttachConsole(-1)之间有什么不同?》经验,为你挑选了2个好方法。

能否请您解释一下我,什么是API函数之间的不同AllocConsoleAttachConsole(-1)?我的意思是如果AttachConsole得到ATTACH_PARENT_PROCESS(DWORD)-1.



1> Michael Burr..:

那么,根本区别在于:

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;
}


是的,它可以.然而,获取控制台要容易得多,只需将项目的输出类型更改为控制台应用程序即可.

2> Zach Hirsch..:

我不认为有一个叫做的功能CreateConsole,但是有AllocConsole.

假设这就是你的意思,我认为不同之处在于,如果父进程没有控制台,则AttachConsole(ATTACH_PARENT_PROCESS)可以返回ERROR_INVALID_HANDLE.

尝试从命令提示符和开始 - >运行运行此代码:

#include 
#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将显示包含a的两个消息框,这意味着两个调用都成功.从"开始" - >"运行"运行时,第一个框包含1,第二个包含0,表示只有第一个调用成功.第二个失败是因为explorer.exe(从Start - > Run启动的进程的父进程)没有控制台.

推荐阅读
Chloemw
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有