我一直在尝试使用Windows API创建一个CreateProcess()过程。即使在浏览网页后,我仍然无法创建新的控制台。CreateProcess()不会创建一个CREATE_NEW_CONSOLE标志的新窗口 - C/C++
Reasearch我已经完成:
我使用的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?
结果:
我写的代码,我将与所有的要求下发布需要创建一个新的控制台,但它不像预期的那样工作。我花了很长时间试图自己找到答案,但上面的文章是唯一可以通过google找到的相关文章。会发生什么是该进程已创建,但它是在我的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;
}
这里是批处理程序我打电话:
@echo off
setlocal enabledelayedexpansion
:start
echo Hello PSAPI on Windows...
pause >nul
exit
我期待有人会知道如何乱用过程比我更多。这是我第一次使用CreateProcess()函数。是的,我知道ShellExecute()。我也知道我的批处理文件不是矩阵,但我想简单地开始。
我刚刚找到解决方案,但我没有足够的声望发布它。对不起,如果我浪费你的时间。 – TheDelightfulEnd
您不需要声望点即可发布答案。您可以发布自己的问题的答案,你不会得到任何声誉点。 –