c++ CoCreateInstance वापसी मूल्य को संभालना




com atl (2)

यहां COM ऑब्जेक्ट बनाने वाला कोड नमूना है:

CComPtr<IBaseFilter> pFilter;
auto hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL,
    CLSCTX_INPROC_SERVER, IID_IBaseFilter, reinterpret_cast<void**>(&pFilter));

मैंने कहीं देखा है कि अगर CoCreateInstance() सफल होने चाहिए इस तरह दिखना चाहिए:

if (SUCCEEDED(hr) && pFilter != nullptr)
{
  // code goes here
}

अगर मैं केवल hr जांच करूँगा तो क्या होगा? क्या यह पर्याप्त नहीं होगा? क्या मुझे यह भी जांचना चाहिए कि filter != nullptr ?

//would this be enough?
if (SUCCEEDED(hr))
{
  // code goes here
}

यह प्रश्न अन्य कॉम विधियों से भी चिंता करता है जैसे QueryInterface()


मुझे लगता है कि यह बेमानी है और दोनों की जांच करने की जरूरत नहीं है

यदि यह असफल हो जाता है, तो वापसी मूल्य आपको बताता है कि कौन-सी त्रुटि हुई। यही कारण है कि यदि कार्य सफल रहा है या नहीं, तो निर्धारित करने के 2 तरीके हैं


CoCreateInstance से S_OK परिणाम होने के बाद आपको गैर- NULL इंटरफ़ेस पॉइंटर प्राप्त करने की गारंटी है, इसलिए आपको इसकी अतिरिक्त जांच करने की आवश्यकता नहीं है। इसे और अधिक विश्वसनीय बनाने के लिए और मुद्दों का पता लगाने में सक्षम होने के लिए जल्दी, आप NULL तुलना करने के लिए ATLASSERT का उपयोग करना चाहेंगे यह रिलीज बिल्ड्स में कोड का उत्पादन नहीं करता है, लेकिन अगर कुछ गलत हो जाता है तो डीबग में एक प्रारंभिक चेतावनी उत्पन्न करता है (विशेष रूप से आप बाद में पेस्ट कोड संपादित या कॉपी कर सकते हैं और पॉइंटर प्राप्त करने के तर्क को बदल सकते हैं।

CComPtr<IBaseFilter> pFilter;
HRESULT hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL, CLSCTX_INPROC_SERVER,
  IID_IBaseFilter, reinterpret_cast<VOID**>(&pFilter));
if(SUCCEEDED(hr))
{
  ATLASSERT(pFilter); // hr is of the interest because might explain failure
                      // pFilter is expected to be non-NULL in case of S_OK
  const CComQIPtr<IDMOWrapperFilter> pDmoWrapperFilter = pFilter;
  if(pDmoWrapperFilter)
  {
    // We're not really interested in QueryInterface's HRESULT since it's
    // either S_OK or E_NOINTERFACE, hr will typically explain nothing special.
    // More important is whether we finally obtained the pointer or not
  }
}






queryinterface