什么是API函数AllocConsole和AttachConsole
发布网友
发布时间:2022-06-01 20:47
我来回答
共1个回答
热心网友
时间:2023-10-16 04:30
好了,所不同的是:AllocConsole()将创建一个新的控制台(以及连接到它)AttachConsole( ATTACH_PARENT_PROCESS /* -1 */)不会创建一个新的控制台,它会附加到父进程的现有的控制台。 在优先种情况下,你会得到一个全新的控制台窗口,在第二种情况下,现有的控制台窗口。 当然,如果你已经连接到控制台(即 CodeGo.net,你是从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. 我不认为有一个调用的函数CreateConsole,但有AllocConsole。 假设这就是我认为不同的是,AttachConsole(ATTACH_PARENT_PROCESS)可以返回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(这是从开始启动的进程的父->运行)不具有控制台。
3. 因为WINAPI它已经有一段时间,但我翻查了MSDN和我没能找到CreateConsole API函数。所以我的猜测是,CreateConsole是传统的东西,并已取代AttachConsole。因此,有可能是没有区别的,但CreateConsole可能已经被废弃了。