avmedia/source/win/framegrabber.cxx |    2 +-
 avmedia/source/win/player.cxx       |    2 +-
 include/systools/win32/comtools.hxx |   15 ++++++++++++---
 3 files changed, 14 insertions(+), 5 deletions(-)

New commits:
commit 64e46c7cb0968a6249dd37ac0a7b12bccc19ee58
Author:     Mike Kaganski <mike.kagan...@collabora.com>
AuthorDate: Mon Dec 20 19:25:58 2021 +0300
Commit:     Mike Kaganski <mike.kagan...@collabora.com>
CommitDate: Tue Dec 21 07:31:55 2021 +0100

    Introduce sal::systools::COMReference::TryCoCreateInstance
    
    Helps fixing uncaught exceptions introduced in commit
    00eb9b8954a129fb365191ce8cdcbc4cf66a7333.
    
    TryCoCreateInstance returns HRESULT, because it allows to pass the info
    to the caller, which must check the result (either HRESULT, or validity
    of the reference) anyway.
    
    In case of failure, the previous contents of com_ptr_ is kept, which
    would be consistent with existing code in connectivity/ado replaced in
    a follow-up patch.
    
    Change-Id: I4c94695de96861ec312247acaa0c8fd35a23010a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/127192
    Tested-by: Mike Kaganski <mike.kagan...@collabora.com>
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>

diff --git a/avmedia/source/win/framegrabber.cxx 
b/avmedia/source/win/framegrabber.cxx
index b7109b251497..17fb229ef057 100644
--- a/avmedia/source/win/framegrabber.cxx
+++ b/avmedia/source/win/framegrabber.cxx
@@ -65,7 +65,7 @@ sal::systools::COMReference<IMediaDet> implCreateMediaDet( 
const OUString& rURL
 {
     sal::systools::COMReference<IMediaDet> pDet;
 
-    if( pDet.CoCreateInstance(CLSID_MediaDet, nullptr, CLSCTX_INPROC_SERVER) )
+    if( SUCCEEDED(pDet.TryCoCreateInstance(CLSID_MediaDet, nullptr, 
CLSCTX_INPROC_SERVER)) )
     {
         OUString aLocalStr;
 
diff --git a/avmedia/source/win/player.cxx b/avmedia/source/win/player.cxx
index ab2c9c8eb20d..23fdb241b3f5 100644
--- a/avmedia/source/win/player.cxx
+++ b/avmedia/source/win/player.cxx
@@ -96,7 +96,7 @@ bool Player::create( const OUString& rURL )
 {
     bool    bRet = false;
 
-    if( mpGB.CoCreateInstance(CLSID_FilterGraph, nullptr, 
CLSCTX_INPROC_SERVER) )
+    if( SUCCEEDED(mpGB.TryCoCreateInstance(CLSID_FilterGraph, nullptr, 
CLSCTX_INPROC_SERVER)) )
     {
         // Don't use the overlay mixer on Windows Vista
         // It disables the desktop composition as soon as RenderFile is called
diff --git a/include/systools/win32/comtools.hxx 
b/include/systools/win32/comtools.hxx
index bc9ecdf5c12c..d26f680569e5 100644
--- a/include/systools/win32/comtools.hxx
+++ b/include/systools/win32/comtools.hxx
@@ -110,12 +110,21 @@ namespace sal::systools
             return operator=(p.template QueryInterface<T>(t));
         }
 
+        HRESULT TryCoCreateInstance(REFCLSID clsid, IUnknown* pOuter = nullptr,
+                                    DWORD nCtx = CLSCTX_ALL)
+        {
+            T* ip;
+            HRESULT hr = ::CoCreateInstance(clsid, pOuter, nCtx, __uuidof(T),
+                                      reinterpret_cast<void**>(&ip));
+            if (SUCCEEDED(hr))
+                release(std::exchange(com_ptr_, ip));
+            return hr;
+        }
+
         COMReference<T>& CoCreateInstance(REFCLSID clsid, IUnknown* pOuter = 
nullptr,
                                           DWORD nCtx = CLSCTX_ALL)
         {
-            clear();
-            HRESULT hr = ::CoCreateInstance(clsid, pOuter, nCtx, __uuidof(T),
-                                            
reinterpret_cast<void**>(&com_ptr_));
+            HRESULT hr = TryCoCreateInstance(clsid, pOuter, nCtx);
             if (FAILED(hr))
                 throw ComError("CoCreateInstance failed!", hr);
 

Reply via email to