gpt4 book ai didi

c++ - CreateProcess( ) 不创建带有 CREATE_NEW_CONSOLE 标志的新窗口 - C/C++

转载 作者:可可西里 更新时间:2023-11-01 18:26:33 31 4
gpt4 key购买 nike

当然,我一直在尝试使用 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 does not create additional console windows under Windows 7?

结果:

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

还有其他差异。如果我在没有 Sleep() 的情况下在 do-while 循环中打印大量字符来减慢它的速度,TerminateProcess() 将失败并显示拒绝访问,并且当我按下转义键时程序将崩溃。这也不是我们想要的行为。

这是我现在拥有的 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;
}

这是我正在调用的 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

关于c++ - CreateProcess( ) 不创建带有 CREATE_NEW_CONSOLE 标志的新窗口 - C/C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20692490/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com