Author: gadamopoulos Date: Tue May 3 09:15:36 2016 New Revision: 71237
URL: http://svn.reactos.org/svn/reactos?rev=71237&view=rev Log: [SHELL32] - lnk files are .. files so don't pretend that CDrivesFolder and CControlPanelFolder can contain lnk files. - Don't create a full pidl just to parse it right away (which is a costly operation) when an IShellLink is queried from a folder. - Fix a bug in CDesktopFolder::GetDisplayNameOf that was exposed by changes above.
Modified: trunk/reactos/dll/win32/shell32/CShellLink.cpp trunk/reactos/dll/win32/shell32/folders/CControlPanelFolder.cpp trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp trunk/reactos/dll/win32/shell32/folders/CDrivesFolder.cpp trunk/reactos/dll/win32/shell32/folders/CFSFolder.cpp trunk/reactos/dll/win32/shell32/wine/shell32_main.h trunk/reactos/dll/win32/shell32/wine/shellord.c
Modified: trunk/reactos/dll/win32/shell32/CShellLink.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/CShellLin... ============================================================================== --- trunk/reactos/dll/win32/shell32/CShellLink.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/CShellLink.cpp [iso-8859-1] Tue May 3 09:15:36 2016 @@ -2231,33 +2231,25 @@ /************************************************************************** * IShellLink_ConstructFromFile */ -HRESULT WINAPI IShellLink_ConstructFromFile(IUnknown *pUnkOuter, REFIID riid, LPCITEMIDLIST pidl, LPVOID *ppv) -{ - CComPtr<IUnknown> psl; - - HRESULT hr = CShellLink::_CreatorClass::CreateInstance(NULL, riid, (void**)&psl); - - if (SUCCEEDED(hr)) - { - CComPtr<IPersistFile> ppf; - - *ppv = NULL; - - hr = psl->QueryInterface(IID_PPV_ARG(IPersistFile, &ppf)); - - if (SUCCEEDED(hr)) - { - WCHAR path[MAX_PATH]; - - if (SHGetPathFromIDListW(pidl, path)) - hr = ppf->Load(path, 0); - else - hr = E_FAIL; - - if (SUCCEEDED(hr)) - *ppv = psl.Detach(); - } - } - - return hr; -} +HRESULT WINAPI IShellLink_ConstructFromPath(WCHAR *path, REFIID riid, LPVOID *ppv) +{ + CComPtr<IPersistFile> ppf; + HRESULT hr = CShellLink::_CreatorClass::CreateInstance(NULL, IID_PPV_ARG(IPersistFile, &ppf)); + if (FAILED(hr)) + return hr; + + hr = ppf->Load(path, 0); + if (FAILED(hr)) + return hr; + + return ppf->QueryInterface(riid, ppv); +} + +HRESULT WINAPI IShellLink_ConstructFromFile(IShellFolder * psf, LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv) +{ + WCHAR path[MAX_PATH]; + if (!ILGetDisplayNameExW(psf, pidl, path, 0)) + return E_FAIL; + + return IShellLink_ConstructFromPath(path, riid, ppv); +}
Modified: trunk/reactos/dll/win32/shell32/folders/CControlPanelFolder.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/C... ============================================================================== --- trunk/reactos/dll/win32/shell32/folders/CControlPanelFolder.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/folders/CControlPanelFolder.cpp [iso-8859-1] Tue May 3 09:15:36 2016 @@ -472,7 +472,6 @@ HRESULT WINAPI CControlPanelFolder::GetUIObjectOf(HWND hwndOwner, UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) { - LPITEMIDLIST pidl; LPVOID pObj = NULL; HRESULT hr = E_INVALIDARG;
@@ -502,12 +501,6 @@ hr = IDataObject_Constructor(hwndOwner, pidlRoot, apidl, cidl, (IDataObject **)&pObj); } else if ((IsEqualIID(riid, IID_IExtractIconA) || IsEqualIID(riid, IID_IExtractIconW)) && (cidl == 1)) { hr = CCPLExtractIcon_CreateInstance(this, apidl[0], riid, &pObj); - - } else if ((IsEqualIID(riid, IID_IShellLinkW) || IsEqualIID(riid, IID_IShellLinkA)) - && (cidl == 1)) { - pidl = ILCombine(pidlRoot, apidl[0]); - hr = IShellLink_ConstructFromFile(NULL, riid, pidl, (LPVOID*)&pObj); - SHFree(pidl); } else { hr = E_NOINTERFACE; }
Modified: trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/C... ============================================================================== --- trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/folders/CDesktopFolder.cpp [iso-8859-1] Tue May 3 09:15:36 2016 @@ -589,7 +589,6 @@ UINT *prgfInOut, LPVOID *ppvOut) { - LPITEMIDLIST pidl; LPVOID pObj = NULL; HRESULT hr = E_INVALIDARG;
@@ -624,9 +623,7 @@ else if ((IsEqualIID(riid, IID_IShellLinkW) || IsEqualIID(riid, IID_IShellLinkA)) && (cidl == 1)) { - pidl = ILCombine (pidlRoot, apidl[0]); - hr = IShellLink_ConstructFromFile(NULL, riid, pidl, (LPVOID*)&pObj); - SHFree (pidl); + hr = IShellLink_ConstructFromFile(this, apidl[0], riid, &pObj); } else hr = E_NOINTERFACE; @@ -682,7 +679,7 @@ int cLen = 0;
/* file system folder or file rooted at the desktop */ - if ((GET_SHGDN_FOR(dwFlags) == SHGDN_FORPARSING) && + if ((GET_SHGDN_FOR(dwFlags) & SHGDN_FORPARSING) && (GET_SHGDN_RELATION(dwFlags) != SHGDN_INFOLDER)) { lstrcpynW(pszPath, sPathTarget, MAX_PATH - 1); @@ -697,7 +694,7 @@ if (GetFileAttributes(pszPath) == INVALID_FILE_ATTRIBUTES) { /* file system folder or file rooted at the AllUsers desktop */ - if ((GET_SHGDN_FOR(dwFlags) == SHGDN_FORPARSING) && + if ((GET_SHGDN_FOR(dwFlags) & SHGDN_FORPARSING) && (GET_SHGDN_RELATION(dwFlags) != SHGDN_INFOLDER)) { SHGetSpecialFolderPathW(0, pszPath, CSIDL_COMMON_DESKTOPDIRECTORY, FALSE);
Modified: trunk/reactos/dll/win32/shell32/folders/CDrivesFolder.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/C... ============================================================================== --- trunk/reactos/dll/win32/shell32/folders/CDrivesFolder.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/folders/CDrivesFolder.cpp [iso-8859-1] Tue May 3 09:15:36 2016 @@ -435,7 +435,6 @@ UINT cidl, PCUITEMID_CHILD_ARRAY apidl, REFIID riid, UINT *prgfInOut, LPVOID *ppvOut) { - LPITEMIDLIST pidl; LPVOID pObj = NULL; HRESULT hr = E_INVALIDARG;
@@ -465,13 +464,6 @@ IDropTarget * pDt = NULL; hr = this->QueryInterface(IID_PPV_ARG(IDropTarget, &pDt)); pObj = pDt; - } - else if ((IsEqualIID(riid, IID_IShellLinkW) || - IsEqualIID(riid, IID_IShellLinkA)) && (cidl == 1)) - { - pidl = ILCombine (pidlRoot, apidl[0]); - hr = IShellLink_ConstructFromFile(NULL, riid, pidl, (LPVOID*) &pObj); - SHFree (pidl); } else hr = E_NOINTERFACE;
Modified: trunk/reactos/dll/win32/shell32/folders/CFSFolder.cpp URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/folders/C... ============================================================================== --- trunk/reactos/dll/win32/shell32/folders/CFSFolder.cpp [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/folders/CFSFolder.cpp [iso-8859-1] Tue May 3 09:15:36 2016 @@ -487,7 +487,6 @@ REFIID riid, UINT * prgfInOut, LPVOID * ppvOut) { - LPITEMIDLIST pidl; LPVOID pObj = NULL; HRESULT hr = E_INVALIDARG;
@@ -532,9 +531,7 @@ else if ((IsEqualIID(riid, IID_IShellLinkW) || IsEqualIID(riid, IID_IShellLinkA)) && (cidl == 1)) { - pidl = ILCombine (pidlRoot, apidl[0]); - hr = IShellLink_ConstructFromFile(NULL, riid, pidl, (LPVOID*)&pObj); - SHFree (pidl); + hr = IShellLink_ConstructFromFile(this, apidl[0], riid, &pObj); } else hr = E_NOINTERFACE; @@ -1426,7 +1423,7 @@ hr = E_FAIL; break; } - hr = IShellLink_ConstructFromFile(NULL, IID_IPersistFile, ILCombine(pidl, apidl[i]), (LPVOID*)&ppf); + hr = IShellLink_ConstructFromFile(this, apidl[i], IID_PPV_ARG(IPersistFile, &ppf)); if (FAILED(hr)) { ERR("Error constructing link from file"); break;
Modified: trunk/reactos/dll/win32/shell32/wine/shell32_main.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/wine/shel... ============================================================================== --- trunk/reactos/dll/win32/shell32/wine/shell32_main.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/wine/shell32_main.h [iso-8859-1] Tue May 3 09:15:36 2016 @@ -74,7 +74,8 @@ HRESULT WINAPI CDefViewDual_Constructor(REFIID riid, LPVOID * ppvOut); HRESULT WINAPI CShell_Constructor(REFIID riid, LPVOID * ppvOut);
-HRESULT WINAPI IShellLink_ConstructFromFile(IUnknown * pUnkOuter, REFIID riid, LPCITEMIDLIST pidl, LPVOID * ppv); +HRESULT WINAPI IShellLink_ConstructFromPath(WCHAR *path, REFIID riid, LPVOID *ppv); +HRESULT WINAPI IShellLink_ConstructFromFile(IShellFolder * psf, LPCITEMIDLIST pidl, REFIID riid, LPVOID *ppv); HRESULT WINAPI IFileSystemBindData_Constructor(const WIN32_FIND_DATAW *pfd, LPBC *ppV); HRESULT WINAPI CPanel_ExtractIconA(LPITEMIDLIST pidl, LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize) DECLSPEC_HIDDEN; HRESULT WINAPI CPanel_ExtractIconW(LPITEMIDLIST pidl, LPCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize) DECLSPEC_HIDDEN;
Modified: trunk/reactos/dll/win32/shell32/wine/shellord.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/shell32/wine/shel... ============================================================================== --- trunk/reactos/dll/win32/shell32/wine/shellord.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/shell32/wine/shellord.c [iso-8859-1] Tue May 3 09:15:36 2016 @@ -823,8 +823,13 @@ ext = strrchr(doc_name, '.'); if (!lstrcmpiA(ext, ".lnk")) { + WCHAR doc_nameW[MAX_PATH]; IShellLinkA* ShellLink; - IShellLink_ConstructFromFile(NULL, &IID_IShellLinkA, (LPCITEMIDLIST)SHSimpleIDListFromPathA(doc_name), (LPVOID*)&ShellLink); + int nLength = MultiByteToWideChar(CP_ACP, 0, doc_name, -1, doc_nameW, MAX_PATH); + if (nLength == 0) + return; + + IShellLink_ConstructFromPath(doc_nameW, &IID_IShellLinkA, (LPVOID*)&ShellLink); IShellLinkA_GetPath(ShellLink, doc_name, MAX_PATH, NULL, 0); IShellLinkA_Release(ShellLink); }