CreateProcess



  • Exitus222 schrieb:

    öhm und das würde wie genau aussehen? 🙂

    Na So:

    PROCESS_INFORMATION pi;
          STARTUPINFO si;
    
         ...(weiterer Programm Code...
    
         memset(&si,0,sizeof(STARTUPINFO));
         memset(&pi, 0, sizeof(PPROCESS_INFORMATION) );
    
        ...(weiterer Programm Code...
    
        CreateProcess(NULL,
    		cmdLine.c_str(),
    		NULL,
    		NULL,
    		FALSE,
    		NULL,
    		NULL,
    		NULL,
    		&si,
    		&pi ));
    

    Wichtig ist nur, das cmdLine jetzt ein std::wstring ist, kein std::string ⚠ .

    Für jeglichen im Quelltext direkt eingesetzten Text, nimm einfach das Makro

    TEXT("Ein String")
    

    . 😉

    EDIT: So könnte man es IMHO auch machen:

    PROCESS_INFORMATIONA pi;
          STARTUPINFOA si;
    
         ...(weiterer Programm Code...
    
         memset(&si,0,sizeof(STARTUPINFOA));
         memset(&pi, 0, sizeof(PPROCESS_INFORMATIONA) );
    
        ...(weiterer Programm Code...
    
        CreateProcessA(NULL,
    		cmdLine.c_str(),
    		NULL,
    		NULL,
    		FALSE,
    		NULL,
    		NULL,
    		NULL,
    		&si,
    		&pi ));
    


  • bei CreateProcessW muss der cmdline String beschreibbar sein. Das ist er mit c_str() von std::wstring nicht. ⚠



  • bei CreateProcessW muss der cmdline String beschreibbar sein. Das ist er mit c_str() von std::wstring nicht.

    Wobei wir wieder bei dem Punkt sind wo std::auto_array<T> fehlt 🙂



  • hustbaer schrieb:

    bei CreateProcessW muss der cmdline String beschreibbar sein. Das ist er mit c_str() von std::wstring nicht.

    Wobei wir wieder bei dem Punkt sind wo std::auto_array<T> fehlt 🙂

    vector tuts doch auch?!



  • ⚠ schrieb:

    bei CreateProcessW muss der cmdline String beschreibbar sein. Das ist er mit c_str() von std::wstring nicht. ⚠

    Hm jo kann sein, bin mal von korrekter Verwendung der Funktion ausgegangen ...

    @OP: Du darfst niemals das const eines c_str()-Return-Werte weg-casten!

    @hustbaer:
    Ne der Punkt fehlt irgend wie nicht, lol.



  • Ja, OK, vector tuts in dem Fall auch. Trotzdem fehlt std::auto_array, und sei es nur aus Symmetriegründen.
    Hätte das schon hin und wieder gebraucht wo ich Ownerschip an einen raw pointer übergeben hätte müssen, und das geht mit std::vector dann wieder nicht.



  • @OP: Du darfst niemals das const eines c_str()-Return-Werte weg-casten!

    Die Aussage stimmt nicht. Natürlich darf man das. Nur den String ändern darf man nicht.



  • @OP: Man darf keinen const string an den zweiten Parameter von CreateProcess übergeben. Das mag noch in der ANSI-Funktion gut gehen, da hier intern dieser Parameter nach Unicode umgewandelt wird und dann einen beschreibbaren String übergeben wird, aber mit der Unicode-Variante (CreateProcessW), geht es schief und erzeugt eine Access-Violation!

    [Angeb-An]

    Woher ich das so genau weis:
    1. Ich hab Zugriff auf den Source-Code
    2. Ich hab die Änderung in der MSDN-Doku veranlasst (jetzt wird "_tcsdup" verwendet und nicht mehr direkt der TEXT übergeben... 😉 )
    Siehe:
    http://msdn.microsoft.com/library/en-us/dllproc/base/createprocess.asp
    (kannst Du gern vergleichen mit einer älteren MSDN-Library)

    [Angeb-Aus]



  • 👎 :p



  • so ein angeber schrieb:

    👎 :p

    Ja, ich gebs zu, war etwas übertrieben... 🙄



  • Das mag noch in der ANSI-Funktion gut gehen, da hier intern dieser Parameter nach Unicode umgewandelt wird und dann einen beschreibbaren String übergeben wird, aber mit der Unicode-Variante (CreateProcessW), geht es schief und erzeugt eine Access-Violation!

    Wie ist das denn unter Windows 95/98 wo es kein CreateProcessW gibt? Muss da auch für CreateProcessA der String beschreibbar sein?



  • Du musst es einfach probieren... ich vermute mal, dass hier Win9x toleranter war..



  • Vielen Dank für die vielen Antworten.
    Ich muss auch dazu sagen das Programmieren nicht so meine stärke ist. Daher vielen dank für euere Hilfe.

    Codfinder du hast geschrieben es würde auch gehen mit

    PROCESS_INFORMATIONA pi; 
          STARTUPINFOA si;
    

    Welche includes brauche ich dafür damit er mir das erkennt? In der MSDN lib. fand ich nichts zu PROCESS_INFORMATIONA genauso zu STARTUPINFOA ohne "A" ja aber nicht mit...



  • Ah okay bei STARTUPINFOA wird _STARTUPINFOA


Anmelden zum Antworten