CreateProcess( ) 不会创建一个带有CREATE_NEW_CONSOLE标志的新窗口 - C/C++
CreateProcess( ) doesn't create a new window with CREATE_NEW_CONSOLE flag - 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()将因访问被拒绝而失败,并且当我按下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;
}
这是我正在调用的批处理程序:
@echo off
setlocal enabledelayedexpansion
:start
echo Hello PSAPI on Windows...
pause >nul
exit
我希望有人会比我更了解如何处理进程。这是我第一次使用CreateProcess()函数。是的,我知道ShellExecute()。我也知道我的批处理文件不是一个矩阵,但我想从简单开始。
CREATE_NEW_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
);
}
此外,请记住,STARTUPINFOEX
可以传递给CreateProcess()
,因此create_process()
函数不应强制使用p->s_info.cb
,这应由调用方负责,具体取决于使用的是STARTUPINFO
还是STARTUPINFOEX
。
- 如何使用Qt在新窗口中显示视频帧
- Qt5 C++将新窗口与Qt设计器链接
- 在SFML(C++)中启动一个新窗口
- Qt将鼠标移动事件转移到新窗口
- 在Clion的新窗口中创建一个新项目
- 如何在Qt中打开新窗口的情况下更改UI?
- 朱奇 - 制作一个新窗口
- 设置 VLC drawable-hwnd 仍会创建一个新窗口
- 运行 SFML 图形后看不到新窗口
- 如何在Mac上打开Carbon中的C++新窗口
- 在Qt中单击QTableView中行的特定单元格时,打开一个新窗口
- 具有控制台输出且没有新窗口的 Win32 应用程序
- C++输出信息到新窗口
- qwebview,如何确定此链接是否为新窗口
- 离开全屏后,QVideOwidget是新窗口
- CreateProcess( ) 不会创建一个带有CREATE_NEW_CONSOLE标志的新窗口 - C/C++
- Qt正在设置新窗口
- 使用SW_HIDE样式使浏览器打开新窗口
- 从窗口 QT 打开新窗口
- C++ WinApi 绘制图像.jpg到新窗口