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
используется.