CreateProcess()不会使用CREATE_NEW_CONSOLE标志创建一个新窗口 – C / C ++

我一直在尝试使用Windows API创建一个使用CreateProcess()的进程。 即使在浏览网页后,我也无法出于某种原因创建新的控制台。

我做的研究:

我使用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下创建其他控制台窗口?

结果:

我已经编写了我将在下面发布的代码,其中包含创建新控制台所需的所有要求,但它没有按预期运行。 我花了很长时间试图自己找到答案,但上面的文章是我通过谷歌找到的唯一相关的。 会发生什么是创建过程,但它在我的C程序控制台中。 我希望能够在没有它的情况下创建程序的程序控制台。

还有其他差异。 如果我在do-while循环中打印了很多字符而没有Sleep()来减慢它的速度,则TerminateProcess()将失败并且拒绝访问,当我按下转义键时程序将崩溃。 这也是不希望的行为。

这是我现在的C程序:

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

这是我正在调用的Batch程序:

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

我期待有人会比我更了解如何搞乱流程。 这是我第一次使用CreateProcess()函数。 是的,我知道ShellExecute()。 我也知道我的批处理文件不是矩阵,但我想从简单开始。

CREATE_NEW_CONSOLECreateProcess()本身的标志,而不是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 ); } 

另外,请记住, STARTUPINFOEX可以传递给CreateProcess() ,因此你的create_process()函数不应该强制p->s_info.cb ,这应该是调用者的责任,这取决于是使用STARTUPINFO还是STARTUPINFOEX