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.
-
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:
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.
-
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.