Чем отличаются API-функции AllocConsole и AttachConsole (-1)? - PullRequest
7 голосов
/ 11 января 2009

Не могли бы вы объяснить, чем отличаются функции API AllocConsole и AttachConsole(-1)? Я имею в виду, если AttachConsole получает ATTACH_PARENT_PROCESS(DWORD)-1.

Ответы [ 3 ]

13 голосов
/ 11 января 2009

Ну, принципиальная разница:

  • 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;
}
5 голосов
/ 11 января 2009

Я не думаю, что есть функция с именем 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) не имеет консоли.

0 голосов
/ 11 января 2009

Прошло много времени с тех пор, как я использовал winapi, но я просмотрел документацию MSDN и не смог найти функцию API CreateConsole. Таким образом, я предполагаю, что CreateConsole является устаревшим компонентом и был заменен AttachConsole. Так что, вероятно, нет никакой разницы, но CreateConsole, вероятно, устарела.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...