Я не думаю, что есть функция с именем 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 (который является родителем процесса, запущенного из Start -> Run) не имеет консоли.