CreateProcess() не создает новое окно с флагом CREATE NEW CONSOLE - C / C++

Я пытался создать процесс с помощью CreateProcess (), используя Windows API, конечно. По какой-то причине я не смог создать новую консоль даже после очистки интернета.

Reasearch я сделал:

я использовал пример кода MSDN в качестве основы для параметров, которые я должен использовать в функции:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682512%28v=vs.85%29.aspx

Я читал следующая статья MSDN для получения информации о том, как вы должны создать новые окна консоли:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682528%28v=vs.85%29.aspx

Я также прочитал аналогичную проблему SO для меня о том, что у кого-то есть такая же проблема :

CreateProcess не создает дополнительные окна консоли под Windows 7?

результаты :

Я написал код I опубликует ниже все требования, необходимые для создания новой консоли, но она не будет вести себя так, как ожидалось. Я потратил много времени, пытаясь найти ответ самостоятельно, но статьи выше были единственными релевантными, которые я мог найти через google. Что происходит, так это то, что процесс создан, но он находится внутри консоли моей программы C. Я хочу быть в состоянии создать процесс без inherting консоли моей программы.

есть и другие нестыковки. Если я печатаю много символы в моем цикле do-while без Sleep (), чтобы замедлить его, TerminateProcess () завершится неудачей с отказом в доступе, и программа рухнет, когда я нажму клавишу escape. Это тоже нежелательное поведение.

вот программа C, которая у меня есть прямо сейчас:

#include <stdio.h>
#include <time.h>
#include <stdlib.h>

#define WIN32_LEAN_AND_MEAN
#include <process.h>
#include <windows.h>

#define IS_PRESSED( vk ) ( GetAsyncKeyState( vk ) & 0x8000 )

typedef struct process
{
    PROCESS_INFORMATION p_info;
    STARTUPINFO s_info;
} process;

void win_error( char * message, int is_exit )
{

    char buffer[BUFSIZ] = { 0 };
    DWORD error_code = GetLastError( );

    FormatMessage
    (
        FORMAT_MESSAGE_FROM_SYSTEM,
        NULL,
        error_code,
        MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ),
        ( LPTSTR ) buffer,
        BUFSIZ,
        NULL
    );

    MessageBox( NULL, buffer, message, MB_ICONWARNING | MB_OK );

    if ( is_exit ) exit( error_code );

    return;
}

int create_process( process * p, const char * exe_path, const char * cmd_line_args )
{
    p->s_info.cb = sizeof( STARTUPINFO );
    p->s_info.dwFlags |= CREATE_NEW_CONSOLE;

    return CreateProcess(
                            exe_path,
                            ( LPSTR )cmd_line_args,
                            NULL,
                            NULL,
                            FALSE,
                            0,
                            NULL,
                            NULL,
                            &p->s_info,
                            &p->p_info
                        );
}

int main( )
{
    process p = { { 0 }, { 0 } };

    srand( time( NULL ) );

    if ( !create_process( &p, "J:C programs and compiliersCWindowsTestbinDebugmatrix.bat", NULL ) )
        win_error( "CreateProcess", 1 );

    CloseHandle( p.p_info.hThread );

    do
    {
        if ( IS_PRESSED( VK_ESCAPE ) )
            if ( !TerminateProcess( p.p_info.hProcess, 0 ) )
                win_error( "TerminateProcess", 0 );

        Sleep( 50 );

    } while ( WaitForSingleObject( p.p_info.hProcess, 0 ) != WAIT_OBJECT_0 );

    CloseHandle( p.p_info.hProcess );

    return 0;
}

вот пакетная программа, которую я вызываю:

@echo off
setlocal enabledelayedexpansion

:start
echo Hello PSAPI on Windows...
pause >nul
exit

Я ожидаю, что кто-то будет знать, как возиться с процессами больше, чем я. Это мой первый раз, когда я использую функцию CreateProcess (). Да, я знаю о ShellExecute(). Я также знаю, что мой пакетный файл не является матрицей, но я хотел начать просто.

1 ответов


CREATE_NEW_CONSOLE флаг CreateProcess() сам, а не STARTUPINFO. Вы ставите флаг не в то место. Попробуйте вместо этого:

int create_process( process * p, const char * exe_path, const char * cmd_line_args )
{
    ...
    return CreateProcessA(
                            exe_path,
                            cmd_line_args,
                            NULL,
                            NULL,
                            FALSE,
                            CREATE_NEW_CONSOLE, // <-- here
                            NULL,
                            NULL,
                            &p->s_info,
                            &p->p_info
                        );
}

кроме того, имейте в виду, что a STARTUPINFOEX можно передать в CreateProcess(), так как create_process() функция не должна форсировать p->s_info.cb, который должен быть вызывающим, в зависимости от того, является ли STARTUPINFO или STARTUPINFOEX используется.