HRESULT SHELL32_CompareDetails(IShellFolder2* isf, LPARAM lParam, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) { SHELLDETAILS sd; WCHAR wszItem1[MAX_PATH], wszItem2[MAX_PATH]; HRESULT hres; hres = isf->GetDetailsOf(pidl1, lParam, &sd); if (FAILED(hres)) return MAKE_COMPARE_HRESULT(1); hres = StrRetToBufW(&sd.str, pidl1, wszItem1, MAX_PATH); if (FAILED(hres)) return MAKE_COMPARE_HRESULT(1); hres = isf->GetDetailsOf(pidl2, lParam, &sd); if (FAILED(hres)) return MAKE_COMPARE_HRESULT(1); hres = StrRetToBufW(&sd.str, pidl2, wszItem2, MAX_PATH); if (FAILED(hres)) return MAKE_COMPARE_HRESULT(1); int ret = wcsicmp(wszItem1, wszItem2); if (ret == 0) return SHELL32_CompareChildren(isf, lParam, pidl1, pidl2); return MAKE_COMPARE_HRESULT(ret); }
HRESULT WINAPI CRegFolder::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2) { if (!pidl1 || !pidl2 || pidl1->mkid.cb == 0 || pidl2->mkid.cb == 0) { ERR("Got an empty pidl!\n"); return E_INVALIDARG; } GUID const *clsid1 = _ILGetGUIDPointer (pidl1); GUID const *clsid2 = _ILGetGUIDPointer (pidl2); if (!clsid1 && !clsid2) { ERR("Got no guid pidl!\n"); return E_INVALIDARG; } else if (clsid1 && clsid2) { if (memcmp(clsid1, clsid2, sizeof(GUID)) == 0) return SHELL32_CompareChildren(this, lParam, pidl1, pidl2); return SHELL32_CompareDetails(this, lParam, pidl1, pidl2); } /* Guid folders come first compared to everything else */ return MAKE_COMPARE_HRESULT(clsid1 ? -1 : 1); }