MB_YESNO Code unklar



  • Ich brauche schon wieder eure Hilfe!
    Auch wenn es sehr stümperhaft klingt, komme ich trotzdem nicht weiter und bitte deshalb um Hilfe!
    Ich habe eine MessageBox mit Ok und Abbrechen. Ok soll - jetzt konkret - einen Eintrag in die Registry schreiben und einen Reboot durchführen, soweit funkt. das auch, mit Abbrechen (Cancel) soll es das aber nicht tun und dafür das Prog beenden. Mein Code:

    if (AfxMessageBox("Bei OK erfolgt ein sofortiger NEUSTART! Programm ausführen?", MB_YESNO | MB_ICONINFORMATION) ==IDYES);
       WinExec("regedit.exe /s Z:\\SETUP\\1System\\pointer.reg", TRUE);
        WinExec("c:\\windows\\system32\\shutdown.exe -r -t 1", SW_SHOW);
    else
        {
            (MB_NO ==IDCANCEL);
        }
    

    Das hier etwas nicht stimmt ist mir irgendwie klar, nur konnte ich in der Hilfe (auch Goggle) und in anderen Foren nichts darüber finden.
    Meine Anwendung ist mit MFC VC6++ erstellt und funkt. tadellos, nur die kleinen Dinge sind's die verzweifeln lassen.
    Danke im voraus für Eure mögliche Hilfe und bitte um den berichtigten Code,



  • mach das Simikolon hinter der if abfrage weg;)

    und geschweifte Klammern um die zwei "WinExec" Prodzeduren;)



  • Was soll diese Zeile bewirken?

    (MB_NO ==IDCANCEL);
    


  • kann ja nicht funktionieren, durch das ; am ende des if wird gar nichts ausgefuehrt, dann macht er die beiden WinExec aufrufe, und dann wars das - ein wunder das es ueberhaupt compiliert da er zwischen den if und den else commands hat, das ist so nicht ueblich {o;

    if(AfxMessageBox("Bei OK erfolgt ein sofortiger NEUSTART! Programm ausführen?", MB_YESNO | MB_ICONINFORMATION) == IDYES)
    {
        WinExec("regedit.exe /s Z:\\SETUP\\1System\\pointer.reg", TRUE);
        WinExec("c:\\windows\\system32\\shutdown.exe -r -t 1", SW_SHOW);
    }
    else
    {
        if(MB_NO ==IDCANCEL)
            //blablubb;
    }
    

    ps. nix MFC - ist WinAPI
    pps. schau dir mal "ExitWindowsEx" an {angenommen du hast windows in d: installiert - dann geht der code nicht mehr {o;



  • Du verwendest die falschen schaltflachen. du übergibst an die messagebox MB_YESNO sprich ja & nein da ist kein cancel dabei

    und das kann nicht funzen da MB_NO wenn überhaupt ein wert ist den du an die messagebox übergibst und nicht zur abfrage dient

    (MB_NO ==IDCANCEL);

    MB_ABORTRETRYIGNORE = Beenden, Wiederholen, Ignorieren

    MB_OK = OK

    MB_OKCANCEL = OK, Abbrechen

    MB_RETRYCANCEL = Wiederholen, Abbrechen

    MB_YESNO = Ja, Nein

    MB_YESNOCANCEL = Ja, Nein, Abbrechen

    IDABORT = Beenden

    IDRETRY = Wiederholen

    IDIGNORE = Ignorieren

    IDYES = Ja

    IDNO = Nein

    IDOK = OK

    IDCANCEL = Abbrechen

    so sollte es gehn

    int iResults = MessageBox(m_hWnd,"Bei OK erfolgt ein sofortiger NEUSTART! Programm ausführen?",
                       "Msg Titel",
                       MB_YESNOCANCEL | MB_ICONINFORMATION);
    
    switch(iResults)
    {
    	case IDYES://Messagebox Ja wurde gewählt
    
    	break;
    	case IDNO://Messagebox Nein wurde gewählt
    
    	break;
    
    	case IDCANCEL://Messagebox Abbrechen wurde gewählt
    
    	break;
    }
    


  • if(AfxMessageBox("Bei OK erfolgt ein sofortiger NEUSTART! Programm ausführen?", MB_YESNO | MB_ICONINFORMATION) ==IDYES) 
    { 
        WinExec("regedit.exe /s Z:\\SETUP\\1System\\pointer.reg", TRUE); 
        WinExec("c:\\windows\\system32\\shutdown.exe -r -t 1", SW_SHOW); 
    } 
    else if(MB_NO ==IDCANCEL)  // <-- Meine Intention sagt der Herr will das so:)
    { 
    
            //blablubb; 
    }
    


  • @BorisDieKlinge
    hättest du den code einmal ausprobiert wüstest du das es kein MB_NO gibt deshal schrieb ich

    ...da MB_NO wenn überhaupt ein wert...

    und selbst wenn man es mit if(MB_OK == IDCANCEL) macht ist das grottenfalsch da es nicht zurückgibt 😉

    MB_... sind werte die nur dafür da sind an die messagebox übergeben zu werden

    [NEW EDIT]
    und wenn es unbedingt ne if abfrage sein soll denn bitte

    if(iResults == IDYES)
    {
    }
    else
    if(iResults == IDNO)
    {
    }
    else
    if(iResults == IDCANCEL)
    {
    }
    


  • int result = AfxMessageBox("Bei OK erfolgt ein sofortiger NEUSTART! Programm ausführen?", MB_OKCANCEL| MB_ICONINFORMATION);
    // YESNO zu OKCANCEL sonst wuerde das result NIE IDCANCEL werden da es kein cancel gibt
    if(result == IDOK) 
    { 
        WinExec("regedit.exe /s Z:\\SETUP\\1System\\pointer.reg", TRUE); 
        WinExec("c:\\windows\\system32\\shutdown.exe -r -t 1", SW_SHOW); 
    } 
    else if(result == IDCANCEL)
    { 
        //blablubb; 
    }
    

    wie LowFly schon sagte, ein IDCANCEL kann es nur geben wenn es zur verfuegung steht, entweder Ok/Cancel oder Yes/No - Yes/Cancel gibts nicht



  • ups.. ja sorry wohl den code zu schnell überlesen.. ich meinte das natürlich so wie "MrEvil" das meinte...



  • zum code von Mr Evil

    int result = AfxMessageBox("Bei OK erfolgt ein sofortiger NEUSTART! Programm ausführen?", MB_OKCANCEL| MB_ICONINFORMATION);
    // YESNO zu OKCANCEL sonst wuerde das result NIE IDCANCEL werden da es kein cancel gibt
    if(result == IDOK)
    {
        WinExec("regedit.exe /s Z:\\SETUP\\1System\\pointer.reg", TRUE);
        WinExec("c:\\windows\\system32\\shutdown.exe -r -t 1", SW_SHOW);
    }
    else if(result == IDCANCEL)
    {
        //blablubb;
    }
    

    leider wird die MessageBox nicht angezeigt, sondern der Befehl wird ausgeführt und es erfolgt sofort ein shutdown,
    könnt ihr mir noch weiterhelfen?,
    danke



  • Zeig mal deinen Code, vielleicht ist was falsch abgeschrieben. 😕



  • mein Code:

    void CSeite6::OnButton2() 
    {
    	int result = AfxMessageBox("Bei OK erfolgt ein sofortiger NEUSTART! Programm ausführen?", MB_OKCANCEL| MB_ICONINFORMATION);
    // YESNO zu OKCANCEL sonst wuerde das result NIE IDCANCEL werden da es kein cancel gibt
    if(result == IDOK)
    {
        WinExec("regedit.exe /s Z:\\SETUP\\1System\\pointer.reg", TRUE);
        WinExec("c:\\windows\\system32\\shutdown.exe -r -t 1", SW_SHOW);
    }
    else if(result == IDCANCEL)
    {
        //blablubb;
    }
    

    danke



  • @estartu er hat doch den code reinkopiert also auch den neuen direckt for deiner Post

    hab den grad mal bei mir reinkopiert & verwendet und bei mir wird die MessageBox angezeigt also der code ist sauber & funzt.

    kann höchstens sein das du irgendwoanderst fehlerhaften code hast der verhindert das die MsgBox aufgeht & sich selbst schon mit OK bestätigt.



  • LowFly schrieb:

    @estartu er hat doch den code reinkopiert also auch den neuen direckt for deiner Post

    Ich hatte vermutet, dass er für den Post dich einfach zitiert hatte.
    Sowas doofes gabs hier auch schon. 😉

    Oder sowas:

    if(result = IDOK)
    


  • besten Dank, ich hatte irgendwo einen Fehler!!!
    tolle Hilfe von Euch,
    danke



  • OMG Was ein ********* Thread... 😮 ...:

    Mach das mal lieber so 😉 :

    enum EInfoCodes
    {
       IFC_SUCCESSFUL,
       IFC_FAILED,
       IFC_ABORTED
    };
    
    EInfoCodes RestartOnQuery(const PTCHAR pszInfo, const PTCHAR pszCaption = NULL, HWND hWnd = NULL)
    {
    	if(MessageBox(hWnd, pszInfo, pszCaption, MB_OKCANCEL | MB_ICONINFORMATION) != IDOK)
    		return (IFC_ABORTED);
    
    	HANDLE           hToken;
    	TOKEN_PRIVILEGES tkp;
    
    	// ....Privilegien anfordern....
    	if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    		return (IFC_FAILED);
    	if(!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &tkp.Privileges[0].Luid))
    		return (IFC_FAILED);
    
    	tkp.PrivilegeCount = 1;
    	tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    
    	if(!AdjustTokenPrivileges(hToken, false, &tkp, 0, (PTOKEN_PRIVILEGES)NULL, 0))
    		return (IFC_FAILED);
    	if(ExitWindowsEx(EWX_REBOOT, EWX_FORCEIFHUNG))
    		return (IFC_SUCCESSFUL);
    	else
    		return (IFC_FAILED);
    }
    

    Benutzung:

    EInfoCodes eReturn = RestartOnQuery(TEXT("Bei OK erfolgt ein sofortiger NEUSTART! Programm ausführen?"), TEXT("Achtung: Neustart..."));
    
    // Ergebnis prüfen, falls erwünscht:
    switch(eReturn)
    {
       case IFC_FAILED:
           // Fehler beim Neustarten...
           break;
       case IFC_ABORTED:
           // Benutzer hat Abbruch verlangt...
           break;
    }
    

    Das funktioniert nämlich immer...

    PS: Ist aber mehr oder weniger alles WinAPI 💡 .

    Hope that helps 😉 .



  • danke euch, problem gelöst, der tipp wäre es wert in die faq aufgenommen zu werden!



  • Ist doch schon drin. 😕
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39051.html

    Oder sollte ich den Thread hier noch verlinken?



  • estartu schrieb:

    Ist doch schon drin. 😕
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39051.html

    Oder sollte ich den Thread hier noch verlinken?

    Als neuen Eintrag fände ich es 'doppelt gemoppelt', aber zum dem bereits vorhandenen ist es doch ne sinnvolle Ergänzung, oder nicht ?

    Also wär dafür 😉



  • Ist ergänzt. 🙂


Anmelden zum Antworten