Hi Huw,

SHCreateItemInKnownFolder() isn't available on WinXP and 2003 too.
I sent another try which loading SHGetKnownFolderPath() dynamically.

Thanks for review!

2017-08-07 18:33 GMT+08:00 Huw Davies <huw@codeweavers.com>:
On Fri, Aug 04, 2017 at 02:54:15PM +0800, Jactry Zeng wrote:
> diff --git a/dlls/shell32/tests/shlfolder.c b/dlls/shell32/tests/shlfolder.c
> index 9e7127dfea..b77619d428 100644
> --- a/dlls/shell32/tests/shlfolder.c
> +++ b/dlls/shell32/tests/shlfolder.c
> @@ -2519,6 +2521,120 @@ static void test_SHCreateShellItem(void)
>������ ������ ������ else
>������ ������ ������ ������ ������ win_skip("No SHCreateItemFromIDList\n");
>
> +������ ������ /* SHCreateItemInKnownFolder */
> +������ ������ if(pSHCreateItemInKnownFolder)
> +������ ������ {
> +������ ������ ������ ������ WCHAR *desktop_path;
> +������ ������ ������ ������ WCHAR testfile_path[MAX_PATH] = {0};
> +������ ������ ������ ������ HANDLE file;
> +������ ������ ������ ������ WCHAR *displayname = NULL;
> +������ ������ ������ ������ int order;
> +������ ������ ������ ������ LPITEMIDLIST pidl_desktop_testfile = NULL;
> +
> +������ ������ ������ ������ if(0)
> +������ ������ ������ ������ {
> +������ ������ ������ ������ ������ ������ /* crashes on Windows */
> +������ ������ ������ ������ ������ ������ pSHCreateItemInKnownFolder(NULL, 0, NULL, NULL, NULL);
> +������ ������ ������ ������ ������ ������ pSHCreateItemInKnownFolder(&FOLDERID_Desktop, 0, NULL, NULL, NULL);
> +������ ������ ������ ������ ������ ������ pSHCreateItemInKnownFolder(&FOLDERID_Desktop, 0, testfileW, &IID_IShellItem, NULL);
> +������ ������ ������ ������ }
> +
> +������ ������ ������ ������ shellitem = (void*)0xdeadbeef;
> +������ ������ ������ ������ ret = pSHCreateItemInKnownFolder(&FOLDERID_Desktop, 0, NULL, &IID_IShellItem,
> +������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������(void**)&shellitem);
> +������ ������ ������ ������ ok(ret == S_OK, "SHCreateItemInKnownFolder failed: 0x%08x.\n", ret);
> +������ ������ ������ ������ ok(shellitem != NULL, "shellitem was %p.\n", shellitem);
> +������ ������ ������ ������ if(SUCCEEDED(ret))
> +������ ������ ������ ������ {
> +������ ������ ������ ������ ������ ������ shellitem2 = (void*)0xdeadbeef;
> +������ ������ ������ ������ ������ ������ ret = pSHCreateShellItem(NULL, NULL, pidl_desktop, &shellitem2);
> +������ ������ ������ ������ ������ ������ ok(SUCCEEDED(ret), "SHCreateShellItem returned %x\n", ret);
> +������ ������ ������ ������ ������ ������ if(SUCCEEDED(ret))
> +������ ������ ������ ������ ������ ������ {
> +������ ������ ������ ������ ������ ������ ������ ������ ret = IShellItem_Compare(shellitem, shellitem2, 0, &order);
> +������ ������ ������ ������ ������ ������ ������ ������ ok(ret == S_OK, "IShellItem_Compare failed: 0x%08x\n", ret);
> +������ ������ ������ ������ ������ ������ ������ ������ ok(!order, "order got wrong value: %d\n", order);
> +������ ������ ������ ������ ������ ������ ������ ������ IShellItem_Release(shellitem2);
> +������ ������ ������ ������ ������ ������ }
> +������ ������ ������ ������ ������ ������ IShellItem_Release(shellitem);
> +������ ������ ������ ������ }
> +
> +������ ������ ������ ������ /* Test with a non-existent file */
> +������ ������ ������ ������ shellitem = (void*)0xdeadbeef;
> +������ ������ ������ ������ ret = pSHCreateItemInKnownFolder(&FOLDERID_Desktop, 0, testfileW, &IID_IShellItem,
> +������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������ ������(void**)&shellitem);
> +������ ������ ������ ������ ok(ret == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), "Expected 0x%08x but SHCreateItemInKnownFolder return: 0x%08x.\n",
> +������ ������ ������ ������ ������ ������HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND), ret);
> +������ ������ ������ ������ ok(shellitem == NULL, "shellitem was %p.\n", shellitem);
> +
> +������ ������ ������ ������ SHGetKnownFolderPath(&FOLDERID_Desktop, 0, NULL, &desktop_path);

It looks like SHGetKnownFolderPath is not available on WinXP, so
you'll have to load it dynamically.������ OTOH I think SHCreateItemInKnownFolder()
is available on all the platforms that we care about, so you can static link
to that one.

Huw.





--
Regards,
Jactry Zeng