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

 点燃半吱煙 发布于 2023-02-09 09:31

我一直在尝试使用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().我也知道我的批处理文件不是矩阵,但我想从简单开始.

1 个回答
  • 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
                            );
    }
    

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

    2023-02-09 09:35 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有