能否请您解释一下我,什么是API函数之间的不同AllocConsole
和AttachConsole(-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; }
我不认为有一个叫做的功能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启动的进程的父进程)没有控制台.