Index: apitests/shell32/CMakeLists.txt =================================================================== --- apitests/shell32/CMakeLists.txt (revision 70407) +++ apitests/shell32/CMakeLists.txt (working copy) @@ -8,7 +8,7 @@ CShellDesktop.cpp menu.cpp testlist.c) -target_link_libraries(shell32_apitest wine uuid) +target_link_libraries(shell32_apitest wine uuid ${PSEH_LIB}) set_module_type(shell32_apitest win32cui) add_importlibs(shell32_apitest user32 gdi32 shell32 ole32 oleaut32 shlwapi msvcrt kernel32) add_cd_file(TARGET shell32_apitest DESTINATION reactos/bin FOR all) Index: apitests/shell32/CShellDesktop.cpp =================================================================== --- apitests/shell32/CShellDesktop.cpp (revision 70407) +++ apitests/shell32/CShellDesktop.cpp (working copy) @@ -49,6 +49,71 @@ ok(psv != psv_2, "Expected %p != %p\n", static_cast(psv), static_cast(psv_2)); } +static void TestCompareGuarded(IShellFolder* psf, LPITEMIDLIST desktop) +{ + HRESULT hr = S_OK; + _SEH2_TRY + { + hr = psf->CompareIDs(0, desktop, NULL); + ok(hr == E_INVALIDARG, "hr = %lx\n", hr); + hr = psf->CompareIDs(0, NULL, desktop); + ok(hr == E_INVALIDARG, "hr = %lx\n", hr); + hr = psf->CompareIDs(0, desktop, desktop); + ok(hr == S_EQUAL, "hr = %lx\n", hr); + } + _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER) + { + hr = E_ABORT; + } + _SEH2_END; + ok(hr != E_ABORT, "hr = %lx\n", hr); +} + +// We would normally use S_LESSTHAN and S_GREATERTHAN, but w2k3 returns numbers like 3 and -3... +#define IS_LESSTAN(hr) (((hr) & 0x8000) && SUCCEEDED(hr)) +#define IS_GREATERTHAN(hr) ((!((hr) & 0x8000)) && SUCCEEDED(hr)) + +static +VOID +TestCompareIDList(IShellFolder* psf) +{ + HRESULT hr = psf->CompareIDs(0, NULL, NULL); + ok(hr == E_INVALIDARG, "hr = %lx\n", hr); + + CComHeapPtr desktop(SHCloneSpecialIDList(NULL, CSIDL_DESKTOP, TRUE)); + TestCompareGuarded(psf, desktop); + + CComHeapPtr internet(SHCloneSpecialIDList(NULL, CSIDL_INTERNET, TRUE)); + hr = psf->CompareIDs(0, internet, desktop); + ok(IS_LESSTAN(hr), "hr = %lx\n", hr); + hr = psf->CompareIDs(0, desktop, internet); + ok(IS_GREATERTHAN(hr), "hr = %lx\n", hr); + + CComHeapPtr programs(SHCloneSpecialIDList(NULL, CSIDL_PROGRAMS, TRUE)); + hr = psf->CompareIDs(0, programs, desktop); + ok(IS_LESSTAN(hr), "hr = %lx\n", hr); + hr = psf->CompareIDs(0, desktop, programs); + ok(IS_GREATERTHAN(hr), "hr = %lx\n", hr); + hr = psf->CompareIDs(0, internet, programs); + ok(IS_GREATERTHAN(hr), "hr = %lx\n", hr); + hr = psf->CompareIDs(0, programs, internet); + ok(IS_LESSTAN(hr), "hr = %lx\n", hr); + + CComPtr persist; + hr = psf->QueryInterface(IID_PPV_ARG(IPersistFolder2, &persist)); + ok(hr == S_OK, "hr = %lx\n", hr); + if (hr == S_OK) + { + CComHeapPtr cur; + hr = persist->GetCurFolder(&cur); + ok(hr == S_OK, "hr = %lx\n", hr); + hr = psf->CompareIDs(0, cur, desktop); + ok(hr == S_EQUAL, "hr = %lx\n", hr); + hr = psf->CompareIDs(0, desktop, cur); + ok(hr == S_EQUAL, "hr = %lx\n", hr); + } +} + START_TEST(CShellDesktop) { HRESULT hr; @@ -83,4 +148,5 @@ ok(psf == static_cast(psf2), "Expected %p == %p\n", static_cast(psf), static_cast(psf2)); TestShellFolder(psf2); + TestCompareIDList(psf); }