<div dir="ltr">Thanks! I sent another try.</div><div class="gmail_extra"><br><div class="gmail_quote">2017-08-14 18:41 GMT+08:00 Huw Davies <span dir="ltr"><<a href="mailto:huw@codeweavers.com" target="_blank">huw@codeweavers.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">On Sat, Aug 12, 2017 at 11:42:40PM +0800, Jactry Zeng wrote:<br>
> +HRESULT WINAPI SHCreateItemFromRelativeName(<wbr>IShellItem *parent, PCWSTR name, IBindCtx *pbc,<br>
> +                                            REFIID riid, void **ppv)<br>
> +{<br>
> +    LPITEMIDLIST pidl_folder = NULL, pidl = NULL;<br>
> +    IShellFolder *desktop = NULL, *folder = NULL;<br>
> +    HRESULT hr;<br>
> +<br>
> +    TRACE("(%p, %p, %p, %s, %p)\n", parent, name, pbc, debugstr_guid(riid), ppv);<br>
<br>
Use debugstr_w() to trace 'name'.<br>
<br>
> +<br>
> +    if(!ppv)<br>
> +        return E_INVALIDARG;<br>
> +    *ppv = NULL;<br>
> +    if(!name)<br>
> +        return E_INVALIDARG;<br>
> +<br>
> +    hr = SHGetIDListFromObject((<wbr>IUnknown*)parent, &pidl_folder);<br>
> +    if(hr != S_OK)<br>
> +        return hr;<br>
> +<br>
> +    hr = SHGetDesktopFolder(&desktop);<br>
> +    if(hr != S_OK)<br>
> +        goto cleanup;<br>
> +<br>
> +    if(!_ILIsDesktop(pidl_folder))<br>
> +    {<br>
> +        hr = IShellFolder_BindToObject(<wbr>desktop, pidl_folder, pbc, &IID_IShellFolder,<br>
> +                                       (void**)&folder);<br>
<br>
You should pass a NULL IBindCtx here.  pbc is associated with binding the name.<br>
<br>
> +        if(hr != S_OK)<br>
> +            goto cleanup;<br>
> +    }<br>
> +<br>
> +    hr = IShellFolder_ParseDisplayName(<wbr>folder ? folder : desktop, NULL, pbc, (LPWSTR)name,<br>
> +                                       NULL, &pidl, NULL);<br>
> +    if(hr != S_OK)<br>
> +        goto cleanup;<br>
> +    hr = SHCreateItemFromIDList(pidl, riid, ppv);<br>
> +<br>
<br>
> diff --git a/dlls/shell32/tests/<wbr>shlfolder.c b/dlls/shell32/tests/<wbr>shlfolder.c<br>
> index 9e7127dfea..cbab88035a 100644<br>
> --- a/dlls/shell32/tests/<wbr>shlfolder.c<br>
> +++ b/dlls/shell32/tests/<wbr>shlfolder.c<br>
<br>
> @@ -2519,6 +2523,86 @@ static void test_SHCreateShellItem(void)<br>
>      else<br>
>          win_skip("No SHCreateItemFromIDList\n");<br>
><br>
> +    /* SHCreateItemFromRelativeName */<br>
> +    if(<wbr>pSHCreateItemFromRelativeName && pSHGetKnownFolderPath)<br>
> +    {<br>
> +        IShellItem *shellitem_desktop = NULL;<br>
> +        WCHAR *desktop_path, *displayname;<br>
> +        WCHAR testfile_path[MAX_PATH] = {0};<br>
> +        HANDLE file;<br>
> +        LPITEMIDLIST pidl_desktop_testfile = NULL;<br>
> +        int order;<br>
> +<br>
> +        ret = pSHCreateShellItem(NULL, NULL, pidl_desktop, &shellitem_desktop);<br>
> +        ok(ret == S_OK, "SHCreateShellItem failed: 0x%08x.\n", ret);<br>
> +<br>
> +        shellitem = (void*)0xdeadbeef;<br>
> +        ret = pSHCreateItemFromRelativeName(<wbr>shellitem_desktop, NULL, NULL, &IID_IShellItem,<br>
> +                                            (void**)&shellitem);<br>
> +        ok(ret == E_INVALIDARG, "Expected 0x%08x but SHCreateItemFromRelativeName return: 0x%08x.\n",<br>
> +           E_INVALIDARG, ret);<br>
> +        ok(shellitem == NULL, "shellitem was %p.\n", shellitem);<br>
> +<br>
> +        /* Test with a non-existent file */<br>
> +        shellitem = (void*)0xdeadbeef;<br>
> +        ret = pSHCreateItemFromRelativeName(<wbr>shellitem_desktop, testfileW, NULL, &IID_IShellItem,<br>
> +                                            (void**)&shellitem);<br>
> +        ok(ret == HRESULT_FROM_WIN32(ERROR_FILE_<wbr>NOT_FOUND),<br>
> +           "Expected 0x%08x but SHCreateItemFromRelativeName return: 0x%08x.\n",<br>
> +           HRESULT_FROM_WIN32(ERROR_FILE_<wbr>NOT_FOUND), ret);<br>
> +        ok(shellitem == NULL, "shellitem was %p.\n", shellitem);<br>
> +<br>
> +        /* Create a file for testing in desktop folder */<br>
> +        pSHGetKnownFolderPath(&<wbr>FOLDERID_Desktop, 0, NULL, &desktop_path);<br>
> +        lstrcatW(testfile_path, desktop_path);<br>
> +        myPathAddBackslashW(testfile_<wbr>path);<br>
> +        lstrcatW(testfile_path, testfileW);<br>
> +        file = CreateFileW(testfile_path, GENERIC_WRITE, 0, NULL, CREATE_NEW, 0, NULL);<br>
> +        ok(file != INVALID_HANDLE_VALUE, "CreateFileW failed! Last error: 0x%08x.\n", GetLastError());<br>
> +        CloseHandle(file);<br>
> +<br>
> +        shellitem = (void*)0xdeadbeef;<br>
> +        ret = pSHCreateItemFromRelativeName(<wbr>shellitem_desktop, testfileW, NULL, &IID_IShellItem,<br>
> +                                            (void**)&shellitem);<br>
> +        ok(ret == S_OK, "SHCreateItemFromRelativeName failed: 0x%08x.\n", ret);<br>
> +        ok(shellitem != NULL, "shellitem was %p.\n", shellitem);<br>
> +        if(SUCCEEDED(ret))<br>
> +        {<br>
> +            ret = IShellItem_GetDisplayName(<wbr>shellitem, 0, &displayname);<br>
> +            ok(ret == S_OK, "IShellItem_GetDisplayName failed: 0x%08x.\n", ret);<br>
> +            ok(!lstrcmpW(displayname, testfileW), "got wrong display name: %s.\n", wine_dbgstr_w(displayname));<br>
> +<br>
> +            shellitem2 = (void*)0xdeadbeef;<br>
> +            ret = pSHCreateItemFromRelativeName(<wbr>shellitem_desktop, testfileW, NULL, &IID_IShellItem,<br>
> +                                                (void**)&shellitem2);<br>
> +            ok(ret == S_OK, "SHCreateItemFromRelativeName failed: 0x%08x.\n", ret);<br>
> +            ret = IShellItem_Compare(shellitem, shellitem2, 0, &order);<br>
> +            ok(ret == S_OK, "IShellItem_Compare failed: 0x%08x.\n", ret);<br>
> +            ok(!order, "order got wrong value: %d.\n", order);<br>
> +            IShellItem_Release(shellitem2)<wbr>;<br>
> +<br>
> +            shellitem2 = (void*)0xdeadbeef;<br>
> +            ret = IShellFolder_ParseDisplayName(<wbr>desktopfolder, NULL, NULL, testfileW, NULL,<br>
> +                                                &pidl_desktop_testfile, NULL);<br>
> +            ok(ret == S_OK, "ParseDisplayName failed 0x%08x.\n", ret);<br>
> +            ret = pSHCreateItemFromIDList(pidl_<wbr>desktop_testfile, &IID_IShellItem, (void**)&shellitem2);<br>
> +            ret = IShellItem_Compare(shellitem, shellitem2, 0, &order);<br>
> +            ok(ret == S_OK, "IShellItem_Compare fail: 0x%08x.\n", ret);<br>
> +            ok(!order, "order got wrong value: %d.\n", order);<br>
> +            pILFree(pidl_desktop_testfile)<wbr>;<br>
> +            IShellItem_Release(shellitem2)<wbr>;<br>
> +<br>
> +            IShellItem_Release(shellitem);<br>
> +        }<br>
> +<br>
> +        DeleteFileW(testfile_path);<br>
> +        CoTaskMemFree(desktop_path);<br>
> +        CoTaskMemFree(displayname);<br>
<br>
dipslayname is uninitialized if the 'if' block isn't executed.  Either<br>
move this inside the 'if' block, or just get rid of the 'if'<br>
condition.  We expect the condition to succeed in all cases anyway.<br>
<span class="HOEnZb"><font color="#888888"><br>
Huw.<br>
<br>
<br>
</font></span></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div>Regards,<br></div><div>Jactry Zeng</div><div><br></div></div></div>
</div>