eine *.cmd öfnen?



  • Also, ich hab hier nen kleines Prog geschrieben und das soll den rechner automatisch nach ner eingegebenen Zeit runterfahren:

    void CShutdownDlg::OnShutdown() 
    {
    	UpdateData(TRUE);
    	FILE *dateistream;
    	char datei[30]="shutdown -s -t";
    	sprintf(datei,"%s %d",datei, m_intsec);
    	dateistream = fopen("C:\\Programme\\down.cmd", "w+");
    	fwrite(datei, sizeof(char), 25, dateistream);
    	fclose(dateistream);
    	system("C:\\Programme\\down.cmd");
    }
    

    Wenn ich das Programm in der entwicklungsumgebung mit F5 ausführe funktioniert es auch, aber die exe allein ausgeführt geht nicht, dann kommt nur die Konsole, die den shutdown-Befehl im aktuellen Verzeichnis auszuführen versucht, was natürlich fehlschlägt. Zur meiner Überraschung startet es sich dabei jedoch selbst erneut, also ein 2. mal.
    Warum?
    Ich hab das auch schon mit ShellExecute und Winexec ausprobiert..immer das selbe ergebnis.
    Und ja ich weiß, dass man auch gleich an cmd senden kann, ich möchte aber dem Umweg über diese Datei gehen.
    hat jemand ne ahnung?
    THX 😃





  • Hmm, das ist eindeutig nicht, das wonach ich gesucht hab', aber ok, ich hab's selbst gelöst vielen Dank auch ^^
    Für die, die es wissen wollen:

    void CShutdownDlg::OnShutdown() 
    {
    	UpdateData(TRUE);
    	char datei[30]="/C shutdown -s -t";
    	sprintf(datei,"%s %d",datei, m_intsec);
    	HWND Handle;
        ShellExecute(0, "open", "cmd.exe", datei, "C:\\", SW_HIDE); 
    
    }
    

    Mein Button-code... 😃



  • Nein, war nicht ganz was du gesucht hast, aber der PC wird ebenfalls heruntergefahren.



  • PS: *.cmd Dateien kann man auch mittels CreateProcess starten...



  • Tja... kann mir mal einer erklären warum ihr das immer so "dumm" lösen müsst=! Warum hat die WinAPI mehr als eine Funktion zum Herunterfahren?! Und warum benutzt ihr dann die Console?!

    hier mal zwei mögliche Lösungen:

    // 1. Lösung
    bool MySystemShutdown(void)
    {
        ::HANDLE hToken; 
        ::_TOKEN_PRIVILEGES tkp; 
    
        if(!::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
            return false; 
    
        ::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); 
    
        tkp.PrivilegeCount            = 1;
        tkp.Privileges[0].Attributes  = SE_PRIVILEGE_ENABLED; 
    
        ::AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0); 
    
        if(::GetLastError() != ERROR_SUCCESS) 
            return false; 
    
        if(!::ExitWindowsEx(EWX_SHUTDOWN | EWX_FORCE, SHTDN_REASON_MAJOR_OPERATINGSYSTEM | SHTDN_REASON_FLAG_PLANNED)) 
            return false; 
    
        return true;
    }
    
    // 2. Lösung
    bool SystemShutdown(LPTSTR lpszMessage)
    {
        ::HANDLE hToken;
        ::_TOKEN_PRIVILEGES tkp;
    
        if(!::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken)) 
            return false; 
    
        ::LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid); 
    
        tkp.PrivilegeCount		= 1;  
        tkp.Privileges[0].Attributes	= SE_PRIVILEGE_ENABLED; 
    
        ::AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0); 
    
        if(::GetLastError() != ERROR_SUCCESS) 
            return false; 
    
        if(!::InitiateSystemShutdown(NULL, lpszMessage, 20, TRUE, FALSE);) 
            return false; 
    
        tkp.Privileges[0].Attributes = 0; 
        ::AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, (PTOKEN_PRIVILEGES) NULL, 0); 
    
        return true; 
    }
    

    So... die erste Methode fährt Windows ganz normal herunter... also als ob man selbst den herunterfahren Dlg geöffnet hätte und dort Herunterfahren bestätigthätte...

    Das 2. zeigt einen Dlg, der eine Zeit lang dort ist... in diesesn Dlg kannst auch ne Message ausgeben... und nach der Zeit fährt er runter...

    Das ist WinAPI 😉



  • Das Grundproblem bestand ja darin, dass ich das über 'ne 'cmd Datei machen wollte (Hat auch nen Grund 😃 )...
    Daher die Lösung über die Konsole 🙂


Anmelden zum Antworten