msinfo32 und dxdiag mit system() erstellen



  • Hi!

    Ich bin gerade dabei für meine Ausbildung ein Abschlussprojekt zu schreiben, in diesem möchte ich gerne eine MSInfo und eine DxDiag erstellen.

    Ich bau mir also aus verschiedenen Quellen mit fprints einen char zusammen und übergebe diesen an die Funktion system().

    Wenn ich meine beiden Funktionen debugge (einmal eben zum erstellen der DxDiag, einmal für die MSInfo) sagt er mir bei der DxDiag-Funktion, sie wäre erfolgreich ausgeführt worden (es wird Fehlercode '0' zurückgegeben, also ERROR_SUCCESS), aber die DxDiag wird nicht erstellt. Kopiere ich mein char in die Zwischenablage und führe diese in der Kommandozeile aus, funktioniert es auch nicht.

    Ganz anders verhält sich dagegen die MSInfo: bei der Funktion wird mir Fehlercode '1' zurückgegeben, also ERROR_INVALID_FUNCTION. Die MSInfo wird also nicht erstellt.
    Wenn ich nun diesen char kopiere und in der Kommandozeile ausführe wird die MSInfo erstellt.

    Hier mal eben die Funktionsaufrufe:

    system ( "dxdiag.exe /t "C:\Dokumente und Einstellungen\Administrator\Desktop\DxDiag.txt" /whql:off" );
    //Infos über die Parameter kann man mit "dxdiag.exe -?" erhalten
    
    system ( ""C:\Programme\Gemeinsame Dateien\Microsoft Shared\MSInfo\MSInfo32.exe" /s "C:\Dokumente und Einstellungen\Administrator\Desktop\msinfo.nfo"" );
    /*Der Pfad der MSInfo ist von Windowsversion zu Windowsversion unterschiedlich und wird deswegen aus der Registry ausgelesen*/
    

    Weiß evtl. jemand warum mein Programm die Befehle nicht ausführt? Wäre euch wirklich sehr dankbar 🙂

    mfg
    Jodahs



  • Vermutlich liegt es daran, daß die Parameter nicht passen, die du den Programmen mitgibst. Was mir an deinem Code dort unten auf jeden Fall auffällt - Anführungszeichen in String-Literalen mußt du mit \" maskieren, sonst werden sie als String-Begrenzung interpretiert.

    (PS: Und dann lern mal den Unterschied zwischen "char" und "char* ;))



  • Hi!

    Danke für die Antwort/Nachfrage :p

    Also wenn ich den String mit fprints zusammenbastel benutze ich natürlich \ um ein Anführungszeichen einzubauen, was ich in meiner Frage in den Funktionsaufruf geschrieben habe ist halt genau der String, der da schlussendlich übergeben wird, ABER das ist ja auch nicht mein Problem und auch nicht meine Frage.

    Aber um das eben klarzustellen, mal eben der fprints:

    //info_path ist der Pfad in dem sich die MSInfo befindet, path der Pfad des Desktips für den gerade angemeldeten User
    sprintf( msinfo, "\"%s\" /s \"%s\\msinfo.nfo\"", info_path, path );
    //temp habe ich nur für debugzwecke eingebaut, damit ich sehen kann, welcher Fehlercode zurück kommt.
    int temp;
    temp = system( msinfo );
    

    Also wenn mir die Funktion keinen Fehler zurückgibt, sollte man ja meinen, dass sie ausgeführt wurde, eigentlich habe ich ja kein Problem mit dem Funktionsaufruf direkt, sondern eher, dass die DxDiag daraufhin einfach nicht erstellt wird.

    (P.S. Wie kommst du darauf, ich würde den Unterschied zwischen einem char und einem char* nicht kennen? Ich übergebe der Funktion nunmal ein char und keinen Zeiger.)



  • Jodahs schrieb:

    (P.S. Wie kommst du darauf, ich würde den Unterschied zwischen einem char und einem char* nicht kennen? Ich übergebe der Funktion nunmal ein char und keinen Zeiger.)

    Tja weit gefehlt.



  • Nun stellt sich noch die Frage wie msinfo deklariert wurde.



  • Hi,

    so, mittlerweile hab ich es geschafft die MSInfo zu erstellen, ich habe woanderst her den Tipp bekommen das ganze mit dem Befehl ShellExecuteEx zu versuchen. Der Vorteil daran ist, dass ich ohne Angabe des Pfades die msinfo32.exe ausführen kann, das spart ein Durchsuchen der Registry.

    @Braunstein: char msinfo[500]; //500 weil der Pfad je nach System so lang sein könnte

    @Entenwickler: Ich weiß net was ihr von mir wollt, eigentlich bin ich hier um was zu lernen, also klärt mich halt einfach auf anstatt mir Vorwürfe zu machen ^^

    Bleibt mir nur noch das Problem die DxDiag über die Kommandozeile zu erstellen zu können, laut ShellExecuteEx führt er alles richtig aus (Funktion gibt bei gelingen true zurück), laut dem Befehl "WaitForSingleObject" wird dieser Prozess gestartet und auch irgendwann beendet, aber irgendwie wird die DxDiag trotzdem nicht erstellt.

    greetings
    Jodahs



  • Hab es mittlerweile geschafft auch eine DxDiag zu erstellen, nur geht es halt eben nicht, wenn man einen Pfad angibt, die DxDiag wird im aktuellen Pfad erstellt, sobald man eine Pfadangabe macht wird die Datei einfach nicht erzeugt - obowhl der Prozess läuft.

    Damit wären also alle meine Probleme gelöst und das obwohl ich anscheinend nicht den unterschied zwischen char und char* kenne 😉



  • Jodahs schrieb:

    @Entenwickler: Ich weiß net was ihr von mir wollt, eigentlich bin ich hier um was zu lernen, also klärt mich halt einfach auf anstatt mir Vorwürfe zu machen ^^

    Die Kurzfassung - 'char' ist ein einzelnes Zeichen, 'char*' ist ein Zeiger auf ein Zeichen(array), 'char[500]' ist ein Zeichenarray (das bei der Übergabe an system() zu einem char* umgewandelt wird)

    Ansonsten: Der System-Befehl sieht eigentlich richtig aus - also könnte es nur daran liegen, daß du dem dort aufgerufenen Programm die falschen Parameter mitgegeben hast.


Log in to reply