summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--avmedia/source/win/framegrabber.cxx2
-rw-r--r--avmedia/source/win/player.cxx2
-rw-r--r--include/systools/win32/comtools.hxx15
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);