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

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

那么,根本区别在于:

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

我不认为有一个名为CreateConsoleAllocConsole ,但是有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两个消息框,这意味着两个调用都成功。 从“开始” – >“运行”运行时,第一个框包含1 ,第二个框包含0 ,表示只有第一个调用成功。 第二个失败是因为explorer.exe(从Start – > Run启动的进程的父进程)没有控制台。

自从我使用winapi以来已经有一段时间了,但我查阅了MSDN文档 ,但我无法找到CreateConsole API函数。 所以我的猜测是CreateConsole是遗留的东西,已被AttachConsole取代。 所以可能没什么区别,但CreateConsole可能已被弃用。