From: Aric Stewart Subject: [PATCH v2] shell32: Implement FCIDM_SHVIEW_CREATELINK Message-Id: <6f790f36-e60a-8a22-505a-4bc1427d8b3c@codeweavers.com> Date: Mon, 5 Jun 2017 10:42:30 -0500 v2: suggestions from Nikolay Sivov Presently the wine file explorer has a create shortcut entry that does nothing. This implements the FCIDM_SHVIEW_CREATELINK command. Signed-off-by: Aric Stewart --- dlls/shell32/shlview_cmenu.c | 49 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/dlls/shell32/shlview_cmenu.c b/dlls/shell32/shlview_cmenu.c index 099f5bc4ad..f3a32ad577 100644 --- a/dlls/shell32/shlview_cmenu.c +++ b/dlls/shell32/shlview_cmenu.c @@ -386,6 +386,51 @@ static void DoOpenProperties(ContextMenu *This, HWND hwnd) FIXME("No property pages found.\n"); } +static void DoCreateLink(ContextMenu *This) +{ + IShellLinkW* shelllink; + IPersistFile* persistfile; + WCHAR wszFilename[MAX_PATH]; + WCHAR root[MAX_PATH]; + WCHAR *lnkfile=NULL; + LPITEMIDLIST pidlFQ; + + static const WCHAR backslashW[]={'\\','\0'}; + static const WCHAR lnkW[]={'.','l','n','k','\0'}; + + if (FAILED(IShellLink_Constructor(NULL, &IID_IShellLinkW, (void**)&shelllink))) + { + ERR("couldn't create ShellLink object\n"); + return; + } + pidlFQ = ILCombine(This->pidl, This->apidl[0]); + IShellLinkW_SetIDList(shelllink, pidlFQ); + SHFree(pidlFQ); + _ILSimpleGetTextW(This->apidl[0], (void*)wszFilename, MAX_PATH); + + SHGetPathFromIDListW(This->pidl, root); + lnkfile=HeapAlloc(GetProcessHeap(), 0, (lstrlenW(root)+1+lstrlenW(wszFilename)+5) * sizeof(*lnkfile)); + lstrcpyW(lnkfile, root); + lstrcatW(lnkfile, backslashW); + lstrcatW(lnkfile, wszFilename); + lstrcatW(lnkfile, lnkW); + + if (FAILED(IShellLinkW_QueryInterface(shelllink, &IID_IPersistFile, (void**)&persistfile))) + { + ERR("couldn't get IPersistFile interface\n"); + IShellLinkW_Release(shelllink); + HeapFree(GetProcessHeap(), 0, lnkfile); + return; + } + TRACE("writing link to %s\n", wine_dbgstr_w(lnkfile)); + if (!SUCCEEDED(IPersistFile_Save(persistfile, lnkfile, FALSE))) + ERR("couldn't write link to %s\n", wine_dbgstr_w(lnkfile)); + + IPersistFile_Release(persistfile); + IShellLinkW_Release(shelllink); + HeapFree(GetProcessHeap(), 0, lnkfile); +} + static HRESULT WINAPI ItemMenu_InvokeCommand( IContextMenu3 *iface, LPCMINVOKECOMMANDINFO lpcmi) @@ -451,6 +496,10 @@ static HRESULT WINAPI ItemMenu_InvokeCommand( TRACE("Verb FCIDM_SHVIEW_PROPERTIES\n"); DoOpenProperties(This, lpcmi->hwnd); break; + case FCIDM_SHVIEW_CREATELINK: + TRACE("Verb FCIDM_SHVIEW_CREATELINK\n"); + DoCreateLink(This); + break; default: FIXME("Unhandled Verb %xl\n",LOWORD(lpcmi->lpVerb)); return E_INVALIDARG;