2013-12-19 104 views
6

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

+0

我刚刚找到解决方案,但我没有足够的声望发布它。对不起,如果我浪费你的时间。 – TheDelightfulEnd

+0

您不需要声望点即可发布答案。您可以发布自己的问题的答案,你不会得到任何声誉点。 –

回答

10

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,这应该是取决于STARTUPINFOSTARTUPINFOEX是否是调用者的责任正在使用。

相关问题