kernel32.CreateProcessA -> ERROR 2



  • Hallo Leute.

    Ich hoffe ich bin hier in der richtigen Sparte.

    Ich versuche mit Python31 einen Prozess über die kernel32-Schnittstelle zu starten:

    def load(self, path_to_exe):
            creation_flags = DEBUG_PROCESS | CREATE_NEW_CONSOLE
            startupinfo = STARTUPINFO()
            process_information = PROCESS_INFORMATION()
    
            # in separatem Fenster zeigen
            startupinfo.dwFlags = 0x1
            startupinfo.wShowWindow = 0x0
    
            startupinfo.cb = sizeof(startupinfo)
            ret = kernel32.CreateProcessA(path_to_exe,
                                          None,
                                          None,
                                          None,
                                          None,
                                          creation_flags,
                                          None,
                                          None,
                                          byref(startupinfo),
                                          byref(process_information))
    

    Ich denke, ihr könnt den Code verstehen, auch wenn ihr Python nicht kennt. Aufgerufen wird die Funktion so:

    load('C:\\WINDOWS\\system32\\notepad.exe')

    Der Prozess startet aber nicht, GetLastError() liefert 0x2 (File not found). Die Datei ist natürlich da, genau wie calc.exe usw..

    Irgendein Hinweis?



  • Welchen Inhalt hat path_to_exe?
    Hat die Variable den vollständigen Pfadnamen oder nur einen Dateinamen ohne Pfad?

    Die Erfahrung hat immer wieder gezeigt, daß man grundsätzlich mit vollständigen Pfadnamen arbeiten soll.

    Anderer Ansatz: Was liefert GetCurrentDirectory() ?

    HTH,
    Martin



  • Mmacher schrieb:

    Welchen Inhalt hat path_to_exe?
    Hat die Variable den vollständigen Pfadnamen oder nur einen Dateinamen ohne Pfad?

    Die Erfahrung hat immer wieder gezeigt, daß man grundsätzlich mit vollständigen Pfadnamen arbeiten soll.

    Der Aufruf wurde in meinem Beitrag angegeben:

    load('C:\\WINDOWS\\system32\\notepad.exe')

    Anderer Ansatz: Was liefert GetCurrentDirectory() ?

    HTH,
    Martin

    C:/Python31



  • Naja, ich hatte mehr irgendetwas in der Richtung

    load( [b]'self',[/b] 'C:\\WINDOWS\\system32\\notepad.exe')
    

    erwartet

    Da ich Python nur vom Hörensagen kenne, kann es natürlich sein, daß Deine Form des Funktionsaufruf (ohne den Teil 'self') auch korrekt ist.

    Nun, ich untersuche mal die an CreateProcessA() übergebenen Parameter:

    1. Ich gehe davon aus, der Bezeichner none ist identisch mit NULLbzw. FALSE (je nach Parameter), liege ich da richtig?

    2. Der nullterminierte (!) Text in path_to_exe enthält 8-bit ANSI Zeichen (und nicht z.B. 16-bit Unicode Zeichen!). Ist das gewährleistet?

    3. versuchs mal mit der Variable creation_flags mit Wert 0 (no creation flags).

    Und was liefert der Return-Wert von CreateProcessA()?
    Sollte natürlich ungleich 0 sein (Wert 0 heißt Fehler).



  • Ist alles so wie du vermutest bezüglich self, None, Nullterminierung.

    Der Returnwert ist 0.

    Aber das mit dem Code prüfe ich mal nach!

    Bis später.



  • Ja, das war's! Seit Version 3 setzt Python auf Unicode - das hat mich bisher nicht tangiert.

    ret = kernel32.CreateProcessA(path_to_exe.encode('utf-8'),
    

    Danke schön!



  • Super, gut zu wissen.

    Den Code kannst aber noch eleganter abändern in CreateProcessW()

    Martin

    Übrigens, ich hatte mir schon immer vorgenommen Python mal näher zu Kennenlernen. Das werde ich in den nächsten Tagen (pardon Nächten) tun.





  • JeanZ schrieb:

    http://tutorial.pocoo.org/index.html

    Wow, super Tutorial, leicht zu lesen 👍
    Hast mir sicher einige Suche erspart, Danke!

    Martin



  • JeanZ schrieb:

    http://tutorial.pocoo.org/index.html

    Habe ich auch "gebookmarked" 👍


Log in to reply