COM: Verwendung von SUCCEEDED



  • Hallo,

    ein Funktionsaufruf der einen HRESULT-Wert zurückgibt kann in einer if - Verzweigung oder eine Schleife ja entweder mit

    if(irgendeineFunktion() == S_OK) 
    // hier passiert irgendwas
    

    oder mit

    if(SUCCEEDED( irgendeineFunktion() )) 
    // hier passiert auch irgendwas
    

    geprüft werden. Ich habe in meinem Programm einen while-loop (ab Zeile 5 bzw. 6) und wenn ich dort mit SUCCEEDED prüfe, läuft die Schleife endlos weiter. Ich möchte in der Schleife aber kein Return einbinden. Meine Frage ist nun warum SUCCEEDED in diesem Fall eine Endlos-Schleife auslöst, denn eigentlich gilt SUCCEEDED doch als zuverlässiger als ... == S_OK. Gibt es Szenarien bei denen man SUCCEEDED nicht verwenden sollte?

    Um diesem Code aus meinem Programm handelt es sich:

    if (SUCCEEDED(m_deckLinkInput->GetDisplayModeIterator(&displayModeIterator))) {
    
    	//if there is a next available IDeckLinkDisplayMode interface, add a new interface to the vector at the end of the vector.
    	//don't use SUCCEEDED for validation here, because this creates an inifinity loop
    	while (SUCCEEDED(displayModeIterator->Next(&displayMode.p))) {
    		m_displayModeVector.push_back(displayMode);
    		++numOfDisplayModes;
    
    		return result; //don't need return statement here
    	}
    }
    
    //This works
    if (SUCCEEDED(m_deckLinkInput->GetDisplayModeIterator(&displayModeIterator))) {
    
        //if there is a next available IDeckLinkDisplayMode interface, add a new interface to the vector at the end of the vector.
        //don't use SUCCEEDED for validation here, because this creates an inifinity loop
        while (displayModeIterator->Next(&displayMode.p) == S_OK) {
    	m_displayModeVector.push_back(displayMode);
    	++numOfDisplayModes;
        }
    }
    


  • Hallo,

    guck doch nach, was die Funktion zurück gibt. Wahrscheinlich S_FAIL (>0 und daher SUCCEEDED)



  • @Jockelx
    Es wird 0 zurückgegeben. Das sollte dann ja S_OK sein.



  • @makopo Aber doch offenbar nicht durchgehend, sonst würde die == S_OK-Abfrage ja auch endlos laufen.



  • @Jockelx

    Also der ==S_OK Loop findet insgesamt 24 Elemente. Und zu jeden Element wird mir, wenn ich result logge, eine 0 zurückgegeben. Mit dem oberen Loop habe ich es auch probiert. Dort wird 0 unendlich oft zurückgegeben.
    Habe ich dich richtig verstanden?



  • @makopo sagte in COM: Verwendung von SUCCEEDED:

    @Jockelx

    Habe ich dich richtig verstanden?

    Ja, nur glauben will ich das nicht so Recht. Zeig mal, wie du logst.
    Was ist denn der Rückgabewert beim ==S_OK-Loop beim 25ten Durchlauf?



  • @Jockelx
    Ab Zeile 12 werden die Elemente aus dem Vector und der Result-Wert ausgeben. Einen 25ten Durchlauf gibt es nicht.

    //enumerate the available display modes for a DeckLink device.
    	if (SUCCEEDED(m_deckLinkInput->GetDisplayModeIterator(&displayModeIterator))) {
    
    		//if there is a next available IDeckLinkDisplayMode interface, add a new interface to the vector at the end of the vector.
    		//don't use SUCCEEDED for validation here, because this creates an inifinity loop
    		while (displayModeIterator->Next(&displayMode.p) == S_OK) {
    			m_displayModeVector.push_back(displayMode);
    
    			++numOfDisplayModes;
    		}
    		
    		for (const auto mode : m_displayModeVector) {
    			std::cout << mode << std::endl;
    			std::cout << "HRESULT " << result << std::endl;
    		}
    		
    		return result;
    	}
    


  • Wobei mir gerade auffällt der result-Wert aus der for-Schleife sich wahrscheinlich auf den if-Zweig bezieht. In der While-Schleife wird allerdings auch 24x 0 ausgegeben.

    Ich habe gerade herausgefunden das die Schleifen anscheinend nicht im if-Zweig stehen dürfen...



  • @makopo
    Ich finde da keine API zu und weiß nicht, was Next zurück gibt.
    Aber wenn du sowas machst:

    for(;;)
    {
       auto result = displayModeIterator->Next(&displayMode.p) ; 
       std::cout << "Result: " << result << '\n'; 
    
       if(result != S_OK)
          break;
    
       m_displayModeVector.push_back(displayMode);
       ++numOfDisplayModes;
    
       
    } 
    

    dann wird 24-mal 0 und dann irgendwas anderes ausgegeben und das wird > 0 sein (1 (?)sein).
    Und das du Probleme hast, hat nichts damit zutun, dass man SUCCEEDED nicht in Schleifen verwenden darf, sondern, dass SUCCEEDED halt was anderes macht, als nur auf S_OK zu testen (nämlich auf >= 0).

    Also teste das nochmal was ich geschrieben habe, damit du weißt was falsch läuft und dann nimm den S_OK-Vergleich.



  • @Jockelx

    Habe es getestet. An 25ter Stelle wird 1 ausgegeben. Allerdings verstehe ich nicht warum..., aber in der Doku wird auch nur == S_OK angewendet. Hat das dann mit dem Aufruf von Next() zu tun?
    Next() wird zur Objekterzeugung vewendet. Es handelt es sich um die DeckLink API.



  • @makopo Natürlich hat das mit dem Aufruf von Next zu tun; der Rückgabe-Wert von Next wird doch in der Schleife getestet!
    Next gibt halt S_OK zurück, wenn alles supi ist und S_FALSE, wenn nicht. Und S_FALSE gilt halt als SUCCEEDED (im Gegensatz zu den "schlimmen" E_Irgendwas-Results).

    Lies nochmal hier für ein besseres Verständnis bzgl. SUCCEEDED.


Anmelden zum Antworten