diff --git a/dlls/scrrun/filesystem.c b/dlls/scrrun/filesystem.c index c0529065547..5daa5cec4ff 100644 --- a/dlls/scrrun/filesystem.c +++ b/dlls/scrrun/filesystem.c @@ -54,6 +54,7 @@ struct drivecollection { IDriveCollection IDriveCollection_iface; LONG ref; DWORD drives; + LONG count; }; struct enumdata { @@ -1675,8 +1676,13 @@ static HRESULT WINAPI drivecoll_get__NewEnum(IDriveCollection *iface, IUnknown * static HRESULT WINAPI drivecoll_get_Count(IDriveCollection *iface, LONG *count) { struct drivecollection *This = impl_from_IDriveCollection(iface); - FIXME("(%p)->(%p): stub\n", This, count); - return E_NOTIMPL; + + TRACE("(%p)->(%p)\n", This, count); + + if (!count) return E_POINTER; + + *count = This->count; + return S_OK; } static const IDriveCollectionVtbl drivecollectionvtbl = { @@ -1695,6 +1701,7 @@ static const IDriveCollectionVtbl drivecollectionvtbl = { static HRESULT create_drivecoll(IDriveCollection **drives) { struct drivecollection *This; + DWORD mask; *drives = NULL; @@ -1703,7 +1710,10 @@ static HRESULT create_drivecoll(IDriveCollection **drives) This->IDriveCollection_iface.lpVtbl = &drivecollectionvtbl; This->ref = 1; - This->drives = GetLogicalDrives(); + This->drives = mask = GetLogicalDrives(); + /* count set bits */ + for (This->count = 0; mask; This->count++) + mask &= mask - 1; *drives = &This->IDriveCollection_iface; return S_OK; diff --git a/dlls/scrrun/tests/filesystem.c b/dlls/scrrun/tests/filesystem.c index c14e8466521..850293466b0 100644 --- a/dlls/scrrun/tests/filesystem.c +++ b/dlls/scrrun/tests/filesystem.c @@ -1157,12 +1157,14 @@ static void test_DriveCollection(void) hr = IDriveCollection_get__NewEnum(drives, (IUnknown**)&enumvar); ok(hr == S_OK, "got 0x%08x\n", hr); + hr = IDriveCollection_get_Count(drives, NULL); + ok(hr == E_POINTER, "got 0x%08x\n", hr); + count = 0; hr = IDriveCollection_get_Count(drives, &count); -todo_wine { ok(hr == S_OK, "got 0x%08x\n", hr); ok(count > 0, "got %d\n", count); -} + V_VT(&var) = VT_EMPTY; fetched = -1; hr = IEnumVARIANT_Next(enumvar, 0, &var, &fetched); @@ -1176,7 +1178,6 @@ todo_wine { ok(hr == S_OK, "got 0x%08x\n", hr); hr = IEnumVARIANT_Skip(enumvar, 1); -todo_wine ok(hr == S_FALSE, "got 0x%08x\n", hr); IEnumVARIANT_Release(enumvar);