Index: dll/win32/shell32/folders/CRecycleBin.cpp =================================================================== --- dll/win32/shell32/folders/CRecycleBin.cpp (revision 69767) +++ dll/win32/shell32/folders/CRecycleBin.cpp (working copy) @@ -169,6 +169,38 @@ return NULL; } +static HRESULT StartEnumerateContents(HWND hwnd, DWORD dwFlags, IEnumIDList**pEnumFiles, IShellFolder2** pRecycleBin) +{ + if (!pEnumFiles) + return E_INVALIDARG; + *pEnumFiles = NULL; + + if (pRecycleBin) + *pRecycleBin = NULL; + + CComPtr spDesktop; + HRESULT hr = SHGetDesktopFolder(&spDesktop); + if (FAILED(hr)) return hr; + + CComHeapPtr spPidlRecycleBin; + hr = SHGetFolderLocation(NULL, CSIDL_BITBUCKET, NULL, 0, &spPidlRecycleBin); + if (FAILED(hr)) return hr; + + CComPtr spRecycleBin; + hr = spDesktop->BindToObject(spPidlRecycleBin, NULL, IID_PPV_ARG(IShellFolder2, &spRecycleBin)); + if (FAILED(hr)) return hr; + + + hr = spRecycleBin->EnumObjects(hwnd, dwFlags, pEnumFiles); + if (FAILED(hr)) return hr; + + if (pRecycleBin) + { + *pRecycleBin = spRecycleBin.Detach(); + } + return hr; +} + CRecycleBinEnum::CRecycleBinEnum() { } @@ -800,6 +832,17 @@ return S_OK; } + +static BOOL RecycleBinIsEmpty() +{ + CComPtr spEnumFiles; + HRESULT hr = StartEnumerateContents(NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &spEnumFiles, NULL); + + CComHeapPtr spPidl; + ULONG itemcount; + return FAILED(hr) || spEnumFiles->Next(1, &spPidl, &itemcount) != S_OK; +} + /************************************************************************* * RecycleBin IContextMenu interface */ @@ -818,7 +861,7 @@ memset(&mii, 0, sizeof(mii)); mii.cbSize = sizeof(mii); mii.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE; - mii.fState = MFS_ENABLED; + mii.fState = RecycleBinIsEmpty() ? MFS_DISABLED : MFS_ENABLED; szBuffer[0] = L'\0'; LoadStringW(shell32_hInstance, IDS_EMPTY_BITBUCKET, szBuffer, sizeof(szBuffer) / sizeof(WCHAR)); mii.dwTypeData = szBuffer; @@ -1264,11 +1307,7 @@ WCHAR szPath[MAX_PATH] = {0}, szBuffer[MAX_PATH]; DWORD dwSize, dwType, count; LONG ret; - IShellFolder *pDesktop, *pRecycleBin; - PIDLIST_ABSOLUTE pidlRecycleBin; - PITEMID_CHILD pidl; HRESULT hr = S_OK; - LPENUMIDLIST penumFiles; STRRET StrRet; TRACE("%p, %s, 0x%08x\n", hwnd, debugstr_w(pszRootPath), dwFlags); @@ -1275,40 +1314,21 @@ if (!(dwFlags & SHERB_NOCONFIRMATION)) { - hr = SHGetDesktopFolder(&pDesktop); - if (FAILED(hr)) - return hr; - hr = SHGetFolderLocation(NULL, CSIDL_BITBUCKET, NULL, 0, &pidlRecycleBin); - if (FAILED(hr)) - { - pDesktop->Release(); - return hr; - } - hr = pDesktop->BindToObject(pidlRecycleBin, NULL, IID_PPV_ARG(IShellFolder, &pRecycleBin)); - CoTaskMemFree(pidlRecycleBin); - pDesktop->Release(); - if (FAILED(hr)) - return hr; - hr = pRecycleBin->EnumObjects(hwnd, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN, &penumFiles); - if (FAILED(hr)) - { - pRecycleBin->Release(); - return hr; - } - + CComPtr spRecycleBin; + CComPtr spEnumFiles; + hr = StartEnumerateContents(hwnd, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS | SHCONTF_INCLUDEHIDDEN, &spEnumFiles, &spRecycleBin); count = 0; if (hr != S_FALSE) { - while (penumFiles->Next(1, &pidl, NULL) == S_OK) + PITEMID_CHILD pidl; + while (spEnumFiles->Next(1, &pidl, NULL) == S_OK) { count++; - pRecycleBin->GetDisplayNameOf(pidl, SHGDN_NORMAL, &StrRet); + spRecycleBin->GetDisplayNameOf(pidl, SHGDN_NORMAL, &StrRet); StrRetToBuf(&StrRet, pidl, szBuffer, _countof(szBuffer)); CoTaskMemFree(pidl); } - penumFiles->Release(); } - pRecycleBin->Release(); switch (count) {