CreateProcess () no crea una nueva ventana con el indicador CREATE_NEW_CONSOLE – C / C ++

He estado intentando crear un proceso con CreateProcess () usando la API de Windows, por supuesto. No he podido crear una nueva consola por algún motivo, incluso después de recorrer la web.

Reasearch he hecho:

Utilicé el código de ejemplo de MSDN como base para los parámetros que debería usar en la función:

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

Leí el siguiente artículo de MSDN para obtener información sobre cómo crear nuevas ventanas de consola:

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

También leí un problema SO similar al mío sobre alguien que tiene el mismo problema:

¿CreateProcess no crea ventanas de consola adicionales en Windows 7?

Resultados:

He escrito el código que publicaré a continuación con todos los requisitos necesarios para crear una nueva consola, pero no se comporta como se esperaba. He pasado mucho tiempo tratando de encontrar la respuesta por mi cuenta, pero los artículos anteriores fueron los únicos relevantes que pude encontrar a través de Google. Lo que sucede es que se crea el proceso, pero está dentro de la consola de mi progtwig en C. Quiero poder crear el proceso sin que se haya heredado la consola de mi progtwig.

También hay otras discrepancias también. Si imprimo muchos caracteres en mi bucle do-while sin Sleep () para ralentizarlo, TerminateProcess () fallará con Access Denied y el progtwig se bloqueará cuando presione la tecla de escape. Este tampoco es el comportamiento deseado.

Aquí está el progtwig de C que tengo ahora:

#include  #include  #include  #define WIN32_LEAN_AND_MEAN #include  #include  #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 compiliers\\C\\WindowsTest\\bin\\Debug\\matrix.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; } 

Aquí está el progtwig de lotes que estoy llamando:

 @echo off setlocal enabledelayedexpansion :start echo Hello PSAPI on Windows... pause >nul exit 

Espero que alguien sepa cómo meterse con los procesos más que yo. Esta es la primera vez que uso la función CreateProcess (). Sí, soy consciente de ShellExecute (). También soy consciente de que mi archivo Batch no es una matriz, pero quería comenzar de manera simple.

CREATE_NEW_CONSOLE es un indicador de CreateProcess() sí mismo, no de STARTUPINFO . Estás poniendo la bandera en el lugar equivocado. Intenta esto en su lugar:

 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 ); } 

Además, tenga en cuenta que se puede pasar un STARTUPINFOEX a CreateProcess() , por lo que su función create_process() no debe forzar p->s_info.cb , que debe ser responsabilidad del llamante dependiendo de si se está utilizando un STARTUPINFO o un STARTUPINFOEX .

Intereting Posts