2017-07-04 4 views
-2

Ich versuche, Prozess (calc.exe) zu erstellen, aber das Programm wird nicht ordnungsgemäß ausgeführt. Es stürzt nur nach dem Start ab. Ich denke, das Problem ist mit LPWSTR Variable, aber ich habe keine Ahnung, wie es zu beheben ist.CreateProcess fehlgeschlagen, unerwarteter Fehler

Unten ist mein Code.

#include "stdafx.h" 
#include <Windows.h> 
#include <cstdio> 
#include <string> 


using namespace std; 

void NewProcess(LPWSTR cmd) { 

    printf("Argv Inside funcion: %s\n", cmd[1]); 
    STARTUPINFO si; 
    PROCESS_INFORMATION pi; 

    ZeroMemory(&si, sizeof(si)); 
    si.cb = sizeof(si); 
    ZeroMemory(&pi, sizeof(pi)); 

    if (!CreateProcess(NULL, 
     cmd,  
     NULL, 
     NULL, 
     FALSE,  
     0,    
     NULL,  
     NULL,  
     &si,   
     &pi)   
     ) 
    { 
     printf("CreateProcess failed (%d).\n", GetLastError()); 
     return; 
    } 

    printf("Process ID: %d Started", pi.dwProcessId); 

    WaitForSingleObject(pi.hProcess, INFINITE); 
    printf("\nProcess ID: %d Terminated!", pi.dwProcessId); 


    CloseHandle(pi.hProcess); 
    CloseHandle(pi.hThread); 
} 

void main(int argc, TCHAR *argv[]) 
{ 
    char text[] = "calc.exe"; 
    wchar_t wtext[20]; 
    mbstowcs(wtext, text, strlen(text) + 1); 
    LPWSTR ptr = wtext; 

    NewProcess(ptr); 
    getchar(); 
} 
+3

C und C++ aren‘ t die gleichen Sprachen. Markieren Sie nur mit dem entsprechenden Tag. – tambre

+1

Genau wo stürzt es ab? Wenn Sie das Programm unter einem Debugger ausführen, sollte es Ihnen die genaue Codestelle und die Folge von Funktionsaufrufen mitteilen, die zu diesem Ort führen (Call-Stack). – zett42

+0

Gelöst ... mein Schlechter. Sori. Das Problem war in wprintf ("Argv Inside Funktion:% s \ n", cmd [1]); Ich habe diese Zeile mit dem Editier-Code verpasst, und es gab ein Problem mit cmd [1], weil cmd zuvor Array war. – bielu000

Antwort

1

Ihre printf wird das erste Zeichen des Befehls als ein Zeiger auf eine (nicht breit) C Zeichenkette zu interpretieren.

Verwenden

wprintf(L"Argv Inside funcion: %s\n", cmd); 

und Sie brauchen nicht main zu erschweren so viel (es gibt keine Mehrbytezeichen in "calc.exe", so gibt es nichts zu konvertieren):

int main(int argc, TCHAR *argv[]) 
{ 
    auto application[] = L"calc.exe"; 
    NewProcess(application); 
    getchar(); 
} 
+0

Sie haben absolut Recht, ich habe diese Zeile beim Bearbeiten von Code verpasst. Danke – bielu000

+0

Aber ich habe noch eine Frage. Es ist eine gute Übung, "mbstowcs (wtext, text, strlen (text) + 1)" zu verwenden; funktionieren? Als ich nach der Lösung suchte, gab es andere Möglichkeiten, LPWSTR var zu initialisieren, aber nicht so. Das ist seltsam für mich, weil diese Funktion freundlicher als andere Wege aussieht. – bielu000

+0

@ bielu000 Verwenden Sie einfach ein breites Zeichenfolgenliteral: 'wchar_t wtext [] = L" calc.exe ";'. Die 'ptr'-Variable ist ebenfalls veraltet, da Arrays automatisch zum Zeiger dekomprimieren, rufen Sie einfach' NewProcess (wtext) 'auf. – zett42

Verwandte Themen