diff --git a/src/vswhere.lib/Formatter.cpp b/src/vswhere.lib/Formatter.cpp index 71d3e5b..9e99b18 100644 --- a/src/vswhere.lib/Formatter.cpp +++ b/src/vswhere.lib/Formatter.cpp @@ -411,7 +411,7 @@ HRESULT Formatter::GetProductId(_In_ ISetupInstance* pInstance, _Out_ VARIANT* p ISetupPackageReferencePtr reference; hr = instance->GetProduct(&reference); - if (SUCCEEDED(hr)) + if (SUCCEEDED(hr) && !!reference) { variant_t vt; @@ -437,7 +437,7 @@ HRESULT Formatter::GetProductPath(_In_ ISetupInstance* pInstance, _Out_ VARIANT* bstr_t bstrProductPath; hr = instance->GetProductPath(bstrProductPath.GetAddress()); - if (SUCCEEDED(hr)) + if (SUCCEEDED(hr) && !!bstrProductPath) { variant_t vt; diff --git a/src/vswhere.lib/InstanceSelector.cpp b/src/vswhere.lib/InstanceSelector.cpp index bf47b67..395081f 100644 --- a/src/vswhere.lib/InstanceSelector.cpp +++ b/src/vswhere.lib/InstanceSelector.cpp @@ -210,7 +210,7 @@ bool InstanceSelector::IsProductMatch(_In_ ISetupInstance2* pInstance) const ISetupPackageReferencePtr product; auto hr = pInstance->GetProduct(&product); - if (FAILED(hr)) + if (FAILED(hr) || !product) { // Should always have a product so no match. return false; diff --git a/test/vswhere.test/TestInstance.h b/test/vswhere.test/TestInstance.h index 9cd8e6e..ab0f5dd 100644 --- a/test/vswhere.test/TestInstance.h +++ b/test/vswhere.test/TestInstance.h @@ -232,20 +232,15 @@ class TestInstance : _Outptr_result_maybenull_ ISetupPackageReference** ppPackage ) { - if (m_product) - { - *ppPackage = m_product; - return S_OK; - } - - return E_NOTFOUND; + *ppPackage = m_product; + return S_OK; } STDMETHODIMP GetProductPath( _Outptr_result_maybenull_ BSTR* pbstrProductPath ) { - return TryGetBSTR(L"ProductPath", pbstrProductPath); + return TryGetBSTR(L"ProductPath", pbstrProductPath, TRUE); } STDMETHODIMP GetErrors( @@ -297,7 +292,7 @@ class TestInstance : _Outptr_result_maybenull_ BSTR* pbstrEnginePath ) { - return TryGetBSTR(L"EnginePath", pbstrEnginePath); + return TryGetBSTR(L"EnginePath", pbstrEnginePath, TRUE); } // ISetupInstanceCatalog @@ -372,7 +367,7 @@ class TestInstance : return E_NOTFOUND; } - STDMETHODIMP TryGetBSTR(_In_ LPCWSTR wszName, _Out_ BSTR* pbstrValue) + STDMETHODIMP TryGetBSTR(_In_ LPCWSTR wszName, _Out_ BSTR* pbstrValue, _In_opt_ BOOL fAllowNull = FALSE) { if (!pbstrValue) { @@ -390,6 +385,11 @@ class TestInstance : return E_OUTOFMEMORY; } } + else if (fAllowNull && E_NOTFOUND == hr) + { + *pbstrValue = NULL; + return S_OK; + } return hr; }