2013-12-19 12 views
6

Ich habe versucht, einen Prozess mit CreateProcess() mit der Windows-API natürlich zu erstellen. Ich war nicht in der Lage, eine neue Konsole aus irgendeinem Grund zu erstellen, selbst nachdem ich das Internet durchforstet habe.CreateProcess() erstellt kein neues Fenster mit CREATE_NEW_CONSOLE-Flag - C/C++

Reasearch ich getan habe:

ich verwendet, um die MSDN Beispiel-Code als Basis für die Parameter sollte ich in der Funktion:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682512%28v=vs.85%29.aspx

las ich die folgenden MSDN-Artikel Informationen darüber, wie Sie neue Konsolenfenster erstellen sollten:

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682528%28v=vs.85%29.aspx

Ich las auch ein ähnliches SO Problem Mine etwa jemand das gleiche Problem:

CreateProcess does not create additional console windows under Windows 7?

Ergebnisse:

ich den Code geschrieben habe ich unter allen Anforderungen wird Post benötigt, um eine neue Konsole zu erstellen, aber es verhält sich nicht wie erwartet. Ich habe lange Zeit versucht, die Antwort selbst zu finden, aber die obigen Artikel waren die einzig relevanten, die ich über Google finden konnte. Was passiert, ist, dass der Prozess erstellt wird, aber es ist in der Konsole meines C-Programms. Ich möchte in der Lage sein, den Prozess zu erstellen, ohne dass es die Programmkonsole intoniert.

Es gibt auch andere Diskrepanzen. Wenn ich viele Zeichen in meiner Do-While-Schleife ohne Sleep() austrage, um es zu verlangsamen, scheitert TerminateProcess() mit Zugriff verweigert, und das Programm stürzt ab, wenn ich die Escape-Taste drücke. Dies ist auch kein gewünschtes Verhalten. Hier

ist das C-Programm, das ich jetzt habe:

#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; 
} 

Hier ist das Batch-Programm Ich rufe:

@echo off 
setlocal enabledelayedexpansion 

:start 
echo Hello PSAPI on Windows... 
pause >nul 
exit 

Ich erwarte jemand wird wissen, wie zu Chaos mit verarbeitet mehr als ich. Dies ist das erste Mal, dass ich die CreateProcess() - Funktion verwende. Ja, ich kenne ShellExecute(). Mir ist auch bewusst, dass meine Batch-Datei keine Matrix ist, sondern ich einfach anfangen wollte.

+0

Ich habe gerade die Lösung gefunden, aber ich habe nicht genug Ruf, um es zu posten. Entschuldigung, wenn ich deine Zeit verschwendet habe. – TheDelightfulEnd

+0

Sie brauchen keine Reputationspunkte, um eine Antwort zu posten. Du kannst eine Antwort auf deine eigene Frage posten, du wirst dafür keine Reputationspunkte bekommen. –

Antwort

10

CREATE_NEW_CONSOLE ist eine Flagge von CreateProcess() selbst, nicht von STARTUPINFO. Sie bringen die Flagge an die falsche Stelle. Versuchen Sie stattdessen:

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 
         ); 
} 

auch bedenken, dass ein STARTUPINFOEX kann CreateProcess() weitergegeben werden, so dass Ihre create_process() Funktion nicht p->s_info.cb sein sollte zwingen, dass der Anrufer die Verantwortung in Abhängigkeit davon, sein sollte, ob ein STARTUPINFO oder ein STARTUPINFOEX ist verwendet werden.

Verwandte Themen