C++ CreateProcess()不';t使用create_new_CONSOLE标志-C/C+创建新窗口+;
当然,我一直在尝试使用Windows API使用CreateProcess()创建一个进程。由于某种原因,我甚至在浏览完网页后也无法创建新的控制台 我所做的研究: 我使用MSDN示例代码作为我应该在函数中使用的参数的基础: 有关如何创建新控制台窗口的信息,我阅读了以下MSDN文章: 我还读到了一个与我类似的关于某人有同样问题的SO问题: 结果: 我已经编写了我将在下面发布的代码,其中包含了创建新控制台所需的所有需求,但它的行为与预期不符。我花了很长时间试图自己找到答案,但上面的文章是我通过谷歌能找到的唯一相关文章。所发生的事情是创建了进程,但它在我的C程序的控制台中。我希望能够创建进程,而无需将其插入程序的控制台 此外,还有其他差异。如果我在do while循环中打印大量字符,而不使用Sleep()来降低速度,TerminateProcess()将失败,访问被拒绝,当我按escape键时,程序将崩溃。这也是不可取的行为 这是我现在拥有的C程序:C++ CreateProcess()不';t使用create_new_CONSOLE标志-C/C+创建新窗口+;,c++,c,winapi,batch-file,process,C++,C,Winapi,Batch File,Process,当然,我一直在尝试使用Windows API使用CreateProcess()创建一个进程。由于某种原因,我甚至在浏览完网页后也无法创建新的控制台 我所做的研究: 我使用MSDN示例代码作为我应该在函数中使用的参数的基础: 有关如何创建新控制台窗口的信息,我阅读了以下MSDN文章: 我还读到了一个与我类似的关于某人有同样问题的SO问题: 结果: 我已经编写了我将在下面发布的代码,其中包含了创建新控制台所需的所有需求,但它的行为与预期不符。我花了很长时间试图自己找到答案,但上面的文章是我通过
#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 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;
}
我希望有人比我更了解如何处理流程。这是我第一次使用CreateProcess()函数。是的,我知道ShellExecute()。我也知道我的批处理文件不是一个矩阵,但我想从简单开始。
CREATE\u NEW\u 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
);
}
int create\u进程(进程*p,常量字符*exe\u路径,常量字符*cmd\u行参数)
{
...
返回CreateProcessA(
exe_路径,
命令行参数,
无效的
无效的
假,,
创建新控制台,//s\u info,
&p->p_信息
);
}
另外,请记住,
STARTUPINFOEX
可以传递给CreateProcess()
,因此您的create\u process()
函数不应强制执行p->s\u info.cb
,这应该是呼叫方的责任,具体取决于是使用STARTUPINFO
还是STARTUPINFOEX
。我刚刚找到了解决方案,但我没有足够的声誉发布它。抱歉,我浪费了你的时间。你不需要声誉点数来发布答案。你可以发布自己问题的答案,但这样做不会给你带来任何声誉积分。
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
);
}