Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CreateProcess()不';t使用create_new_CONSOLE标志-C/C+创建新窗口+;_C++_C_Winapi_Batch File_Process - Fatal编程技术网

C++ CreateProcess()不';t使用create_new_CONSOLE标志-C/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问题: 结果: 我已经编写了我将在下面发布的代码,其中包含了创建新控制台所需的所有需求,但它的行为与预期不符。我花了很长时间试图自己找到答案,但上面的文章是我通过

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

我所做的研究:

我使用MSDN示例代码作为我应该在函数中使用的参数的基础:

有关如何创建新控制台窗口的信息,我阅读了以下MSDN文章:

我还读到了一个与我类似的关于某人有同样问题的SO问题:

结果:

我已经编写了我将在下面发布的代码,其中包含了创建新控制台所需的所有需求,但它的行为与预期不符。我花了很长时间试图自己找到答案,但上面的文章是我通过谷歌能找到的唯一相关文章。所发生的事情是创建了进程,但它在我的C程序的控制台中。我希望能够创建进程,而无需将其插入程序的控制台

此外,还有其他差异。如果我在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 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
                        );
}