2013-12-19 103 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是否是調用者的責任正在使用。

相關問題