Zebediah Figura : devenum: Return S_FALSE from CreateClassEnumerator() if no devices exist.

Alexandre Julliard julliard at winehq.org
Fri Aug 23 09:31:25 CDT 2019


Module: wine
Branch: stable
Commit: d63079f2c71306743a7ca924916ac37e57e274c8
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=d63079f2c71306743a7ca924916ac37e57e274c8

Author: Zebediah Figura <z.figura12 at gmail.com>
Date:   Fri Apr  5 19:41:13 2019 -0500

devenum: Return S_FALSE from CreateClassEnumerator() if no devices exist.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=46316
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
(cherry picked from commit e0da0b777a293059c32a7c846dff16ef0738b2de)
Signed-off-by: Michael Stefaniuc <mstefani at winehq.org>

---

 dlls/devenum/createdevenum.c | 18 +++++++++++++++++-
 dlls/devenum/tests/devenum.c |  6 ++++++
 2 files changed, 23 insertions(+), 1 deletion(-)

diff --git a/dlls/devenum/createdevenum.c b/dlls/devenum/createdevenum.c
index 8a3160c..65c1ccd 100644
--- a/dlls/devenum/createdevenum.c
+++ b/dlls/devenum/createdevenum.c
@@ -862,7 +862,23 @@ static HRESULT WINAPI DEVENUM_ICreateDevEnum_CreateClassEnumerator(
     else if (IsEqualGUID(class, &CLSID_VideoInputDeviceCategory))
         register_avicap_devices();
 
-    return create_EnumMoniker(class, out);
+    if (SUCCEEDED(hr = create_EnumMoniker(class, out)))
+    {
+        IMoniker *mon;
+        hr = IEnumMoniker_Next(*out, 1, &mon, NULL);
+        if (hr == S_OK)
+        {
+            IMoniker_Release(mon);
+            IEnumMoniker_Reset(*out);
+        }
+        else
+        {
+            IEnumMoniker_Release(*out);
+            *out = NULL;
+        }
+    }
+
+    return hr;
 }
 
 /**********************************************************************
diff --git a/dlls/devenum/tests/devenum.c b/dlls/devenum/tests/devenum.c
index e31f65c..1ce0d04 100644
--- a/dlls/devenum/tests/devenum.c
+++ b/dlls/devenum/tests/devenum.c
@@ -68,6 +68,7 @@ static void test_devenum(IBindCtx *bind_ctx)
     WCHAR *displayname;
     VARIANT var;
     HRESULT hr;
+    int count;
 
     hr = CoCreateInstance(&CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC,
                            &IID_ICreateDevEnum, (LPVOID*)&create_devenum);
@@ -104,6 +105,8 @@ static void test_devenum(IBindCtx *bind_ctx)
 
         if (hr == S_OK)
         {
+            count = 0;
+
             while (IEnumMoniker_Next(enum_moniker, 1, &moniker, NULL) == S_OK)
             {
                 hr = IMoniker_GetDisplayName(moniker, NULL, NULL, &displayname);
@@ -134,8 +137,11 @@ static void test_devenum(IBindCtx *bind_ctx)
                 CoTaskMemFree(displayname);
                 IPropertyBag_Release(prop_bag);
                 IMoniker_Release(moniker);
+                count++;
             }
             IEnumMoniker_Release(enum_moniker);
+
+            ok(count > 0, "CreateClassEnumerator() returned S_OK but no devices were enumerated.\n");
         }
     }
 




More information about the wine-cvs mailing list