diff options
-rw-r--r-- | avmedia/source/win/framegrabber.cxx | 2 | ||||
-rw-r--r-- | avmedia/source/win/player.cxx | 2 | ||||
-rw-r--r-- | include/systools/win32/comtools.hxx | 15 |
3 files changed, 14 insertions, 5 deletions
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); |