CreateProcess: Parameter mitgeben?



  • Hallo,

    ich möchte die msinfo32.exe mit dem Parameter "report" starten, um mir
    Systeminfos in eine Textdatei umzuleiten. Da ich bei einem einfachen
    ShellExecute nicht mitbekomme wann die msinfo32.exe mit ihrer Arbeit
    fertig ist, dachte ich an CreateProcess.

    Hier war ich der Meinung es so verstanden zu haben, dass in den zweiten
    Parameter die eigentlichen Paramter zur msinfo32.exe gehören.
    Es scheint so jedoch nicht richtig zu sein:

    PROCESS_INFORMATION pi = {0}; 
    	STARTUPINFO si = {sizeof(si)}; 
    	si.wShowWindow = SW_NORMAL; 
    
    	::CreateProcess( _T("C:\\programme\\gemeinsame dateien\\microsoft shared\\msinfo\\msinfo32.exe"), _T("/report c:\\reportfile.txt"), NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi); 
    	::WaitForSingleObject( pi.hProcess, INFINITE); 
    
    	CloseHandle(pi.hProcess); 
    	CloseHandle(pi.hThread); 
    	::MessageBox( NULL, _T("Fertig!"), NULL, 0);
    

    Vielleicht interpretiere ich die MSDN auch ganz falsch und man muss im
    ersten Paremeter cmd.exe rufen und im zweiten dann den Pfad zur Exe inkl. Parametern 😕



  • damit ich damals Argumente übergeben konnte, musste ich ein Leerzeichen davor machen:

    _T(" /report c:\\reportfile.txt")
    

    vielleicht liegt es daran.



  • Danke, ich habe es hinbekommen. Nun habe ich dann aber die beiden ersten
    Parameter durch CStrings ausgetauscht, statt sie fest reinzuschreiben.
    Diese CStrings werden jedoch zuvor noch in LPSTR umgewandelt.

    CreateProcess gibt mir nicht NULL zurück und dennoch wir keine *.nfo-Datei
    geschrieben.

    CString newpfad = " /nfo c:\\test.nfo";
    CString iu = "C:\\programme\\gemeinsame dateien\\microsoft shared\\msinfo\\msinfo32.exe";
    
    	PROCESS_INFORMATION pi = {0}; 
    	STARTUPINFO si = {sizeof(si)}; 
    	si.wShowWindow = SW_NORMAL; 
    
    	LPSTR OriginChar=  iu.GetBuffer(iu.GetLength());
    	LPSTR parms=  newpfad.GetBuffer(newpfad.GetLength());
    
    BOOL chk = 0;
    
    chk =	::CreateProcess( OriginChar, parms, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi);
    
    if(chk==NULL)
    {
    	MessageBox("Fehler bei CreateProcess! GetLastError prüfen!");
    //...
    
    }
    ::WaitForSingleObject( pi.hProcess, INFINITE);
    

    //usw.

    Hat jemand eine Idee warum hier keine nfo-Datei erzeugt wird?



  • Ich habe den blöden Verdacht, dass es an dem zu langen oder in irgendeiner Form wohl
    ungültigem Pfad des zweiten Parameters liegt:

    C:\\Dokumente und Einstellungen\\Ben\\Eigene Dateien\\Visual Studio 2008\\Projects\\TestProjekt\\datei2.nfo

    Sowas kurzes wie c:\\test.nfo funktioniert einwandfrei...

    Gibt es eine Funktion um so lange Pfade irgendwie in sowas wie

    C:\\Dokumente1\\Ben\\Eigene1\\Visual Studio 2008\\Projects\\TestProjekt\\datei2.nfo

    umzuwandeln?



  • bette den pfad doch mal in " ein

    "/nfo \"C:\\Dokumente und Einstellungen\\Ben\\Eigene Dateien\\Visual Studio 2008\\Projects\\TestProjekt\\datei2.nfo\""
    


  • So einfach kann das Leben sein. Ich danke dir für den Hinweis 👍 👍
    Es sind demnach die Leerzeichen welche die Probleme verursacht haben.


  • Mod

    Leg das Working directory korrekt fest dann kannst Du Dir die Pfadangabe sparen.

    BTW: msinfo32.exe ist als Applikation registriert und wird auch ohne Pfadangabe gefunden wenn Du ShellExecute verwendest.



  • Hallo Martin,

    vielleicht kannst du mir sagen, ob msinfo32.exe grundsätzlich in allen
    Windowsversionen ab Windows XP verfügbar ist (inkl. 64bit Varianten)?
    Dann spare ich mir die Anfrage bei MS 😉


  • Mod

    IMHO war das Tool auch schon bei Win9x dabei...



  • jup is bei xp 64-bit dabei


  • Mod

    MSINFO32 auf 64bit... irgendwie interesant 🤡


Anmelden zum Antworten