4 * Copyright 2016 Giannis Adamopoulos
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23 WINE_DEFAULT_DEBUG_CHANNEL (shell
);
25 HRESULT CALLBACK
RegFolderContextMenuCallback(IShellFolder
*psf
,
32 if (uMsg
!= DFM_INVOKECOMMAND
|| wParam
!= DFM_CMD_PROPERTIES
)
35 PIDLIST_ABSOLUTE pidlFolder
;
36 PUITEMID_CHILD
*apidl
;
38 HRESULT hr
= SH_GetApidlFromDataObject(pdtobj
, &pidlFolder
, &apidl
, &cidl
);
39 if (FAILED_UNEXPECTEDLY(hr
))
42 if (_ILIsMyComputer(apidl
[0]))
44 if (32 >= (UINT_PTR
)ShellExecuteW(hwnd
,
47 L
"shell32.dll,Control_RunDLL sysdm.cpl",
54 else if (_ILIsDesktop(apidl
[0]))
56 if (32 >= (UINT_PTR
)ShellExecuteW(hwnd
,
59 L
"shell32.dll,Control_RunDLL desk.cpl",
66 else if (_ILIsNetHood(apidl
[0]))
69 if (32 >= (UINT_PTR
)ShellExecuteW(NULL
,
72 L
"::{7007ACC7-3202-11D1-AAD2-00805FC1270E}",
79 else if (_ILIsBitBucket(apidl
[0]))
81 /* FIXME: detect the drive path of bitbucket if appropiate */
82 if (!SH_ShowRecycleBinProperties(L
'C'))
87 _ILFreeaPidl(apidl
, cidl
);
92 HRESULT
CGuidItemContextMenu_CreateInstance(PCIDLIST_ABSOLUTE pidlFolder
,
95 PCUITEMID_CHILD_ARRAY apidl
,
102 GUID
*pGuid
= _ILGetGUIDPointer(apidl
[0]);
108 wcscpy(key
, L
"CLSID\\");
109 HRESULT hr
= StringFromCLSID(*pGuid
, &pwszCLSID
);
112 wcscpy(&key
[6], pwszCLSID
);
113 AddClassKeyToArray(key
, hKeys
, &cKeys
);
116 AddClassKeyToArray(L
"Folder", hKeys
, &cKeys
);
118 return CDefFolderMenu_Create2(pidlFolder
, hwnd
, cidl
, apidl
, psf
, RegFolderContextMenuCallback
, cKeys
, hKeys
, ppcm
);
121 HRESULT
CGuidItemExtractIcon_CreateInstance(LPCITEMIDLIST pidl
, REFIID iid
, LPVOID
* ppvOut
)
123 CComPtr
<IDefaultExtractIconInit
> initIcon
;
127 WCHAR wTemp
[MAX_PATH
];
129 hr
= SHCreateDefaultExtractIcon(IID_PPV_ARG(IDefaultExtractIconInit
,&initIcon
));
133 if (_ILIsDesktop(pidl
))
135 initIcon
->SetNormalIcon(swShell32Name
, -IDI_SHELL_DESKTOP
);
136 return initIcon
->QueryInterface(iid
, ppvOut
);
139 riid
= _ILGetGUIDPointer(pidl
);
143 /* my computer and other shell extensions */
144 static const WCHAR fmt
[] = { 'C', 'L', 'S', 'I', 'D', '\\',
145 '{', '%', '0', '8', 'l', 'x', '-', '%', '0', '4', 'x', '-', '%', '0', '4', 'x', '-',
146 '%', '0', '2', 'x', '%', '0', '2', 'x', '-', '%', '0', '2', 'x', '%', '0', '2', 'x',
147 '%', '0', '2', 'x', '%', '0', '2', 'x', '%', '0', '2', 'x', '%', '0', '2', 'x', '}', 0
152 riid
->Data1
, riid
->Data2
, riid
->Data3
,
153 riid
->Data4
[0], riid
->Data4
[1], riid
->Data4
[2], riid
->Data4
[3],
154 riid
->Data4
[4], riid
->Data4
[5], riid
->Data4
[6], riid
->Data4
[7]);
156 const WCHAR
* iconname
= NULL
;
157 if (_ILIsBitBucket(pidl
))
159 static const WCHAR szFull
[] = {'F','u','l','l',0};
160 static const WCHAR szEmpty
[] = {'E','m','p','t','y',0};
161 CComPtr
<IEnumIDList
> EnumIDList
;
164 CComPtr
<IShellFolder2
> psfRecycleBin
;
165 CComPtr
<IShellFolder
> psfDesktop
;
166 hr
= SHGetDesktopFolder(&psfDesktop
);
169 hr
= psfDesktop
->BindToObject(pidl
, NULL
, IID_PPV_ARG(IShellFolder2
, &psfRecycleBin
));
171 hr
= psfRecycleBin
->EnumObjects(NULL
, SHCONTF_FOLDERS
| SHCONTF_NONFOLDERS
, &EnumIDList
);
174 LPITEMIDLIST pidl
= NULL
;
175 if (SUCCEEDED(hr
) && (hr
= EnumIDList
->Next(1, &pidl
, &itemcount
)) == S_OK
)
184 if (HCR_GetIconW(xriid
, wTemp
, iconname
, MAX_PATH
, &icon_idx
))
186 initIcon
->SetNormalIcon(wTemp
, icon_idx
);
190 if (IsEqualGUID(*riid
, CLSID_MyComputer
))
191 initIcon
->SetNormalIcon(swShell32Name
, -IDI_SHELL_MY_COMPUTER
);
192 else if (IsEqualGUID(*riid
, CLSID_MyDocuments
))
193 initIcon
->SetNormalIcon(swShell32Name
, -IDI_SHELL_MY_DOCUMENTS
);
194 else if (IsEqualGUID(*riid
, CLSID_NetworkPlaces
))
195 initIcon
->SetNormalIcon(swShell32Name
, -IDI_SHELL_MY_NETWORK_PLACES
);
197 initIcon
->SetNormalIcon(swShell32Name
, -IDI_SHELL_FOLDER
);
200 return initIcon
->QueryInterface(iid
, ppvOut
);
203 class CRegFolderEnum
:
204 public CEnumIDListBase
209 HRESULT
Initialize(LPCWSTR lpszEnumKeyName
, DWORD dwFlags
);
210 HRESULT
AddItemsFromKey(HKEY hkey_root
, LPCWSTR szRepPath
);
212 BEGIN_COM_MAP(CRegFolderEnum
)
213 COM_INTERFACE_ENTRY_IID(IID_IEnumIDList
, IEnumIDList
)
217 CRegFolderEnum::CRegFolderEnum()
221 CRegFolderEnum::~CRegFolderEnum()
225 HRESULT
CRegFolderEnum::Initialize(LPCWSTR lpszEnumKeyName
, DWORD dwFlags
)
227 WCHAR KeyName
[MAX_PATH
];
228 static const WCHAR KeyNameFormat
[] = L
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\%s\\Namespace";
230 if (!(dwFlags
& SHCONTF_FOLDERS
))
233 HRESULT hr
= StringCchPrintfW(KeyName
, MAX_PATH
, KeyNameFormat
, lpszEnumKeyName
);
234 if (FAILED_UNEXPECTEDLY(hr
))
237 AddItemsFromKey(HKEY_LOCAL_MACHINE
, KeyName
);
238 AddItemsFromKey(HKEY_CURRENT_USER
, KeyName
);
243 HRESULT
CRegFolderEnum::AddItemsFromKey(HKEY hkey_root
, LPCWSTR szRepPath
)
245 WCHAR name
[MAX_PATH
];
248 if (RegOpenKeyW(hkey_root
, szRepPath
, &hkey
) != ERROR_SUCCESS
)
251 for (int idx
= 0; ; idx
++)
253 if (RegEnumKeyW(hkey
, idx
, name
, MAX_PATH
) != ERROR_SUCCESS
)
256 /* If the name of the key is not a guid try to get the default value of the key */
259 DWORD dwSize
= sizeof(name
);
260 RegGetValueW(hkey
, name
, NULL
, RRF_RT_REG_SZ
, NULL
, name
, &dwSize
);
265 LPITEMIDLIST pidl
= _ILCreateGuidFromStrW(name
);
278 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
283 CAtlStringW m_rootPath
;
284 CAtlStringW m_enumKeyName
;
285 CComHeapPtr
<ITEMIDLIST
> m_pidlRoot
;
287 HRESULT
GetGuidItemAttributes (LPCITEMIDLIST pidl
, LPDWORD pdwAttributes
);
291 HRESULT WINAPI
Initialize(const GUID
*pGuid
, LPCITEMIDLIST pidlRoot
, LPCWSTR lpszPath
, LPCWSTR lpszEnumKeyName
);
294 virtual HRESULT WINAPI
ParseDisplayName(HWND hwndOwner
, LPBC pbc
, LPOLESTR lpszDisplayName
, ULONG
*pchEaten
, PIDLIST_RELATIVE
*ppidl
, ULONG
*pdwAttributes
);
295 virtual HRESULT WINAPI
EnumObjects(HWND hwndOwner
, DWORD dwFlags
, LPENUMIDLIST
*ppEnumIDList
);
296 virtual HRESULT WINAPI
BindToObject(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
);
297 virtual HRESULT WINAPI
BindToStorage(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
);
298 virtual HRESULT WINAPI
CompareIDs(LPARAM lParam
, PCUIDLIST_RELATIVE pidl1
, PCUIDLIST_RELATIVE pidl2
);
299 virtual HRESULT WINAPI
CreateViewObject(HWND hwndOwner
, REFIID riid
, LPVOID
*ppvOut
);
300 virtual HRESULT WINAPI
GetAttributesOf(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, DWORD
*rgfInOut
);
301 virtual HRESULT WINAPI
GetUIObjectOf(HWND hwndOwner
, UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, REFIID riid
, UINT
* prgfInOut
, LPVOID
* ppvOut
);
302 virtual HRESULT WINAPI
GetDisplayNameOf(PCUITEMID_CHILD pidl
, DWORD dwFlags
, LPSTRRET strRet
);
303 virtual HRESULT WINAPI
SetNameOf(HWND hwndOwner
, PCUITEMID_CHILD pidl
, LPCOLESTR lpName
, DWORD dwFlags
, PITEMID_CHILD
*pPidlOut
);
306 virtual HRESULT WINAPI
GetDefaultSearchGUID(GUID
*pguid
);
307 virtual HRESULT WINAPI
EnumSearches(IEnumExtraSearch
**ppenum
);
308 virtual HRESULT WINAPI
GetDefaultColumn(DWORD dwRes
, ULONG
*pSort
, ULONG
*pDisplay
);
309 virtual HRESULT WINAPI
GetDefaultColumnState(UINT iColumn
, DWORD
*pcsFlags
);
310 virtual HRESULT WINAPI
GetDetailsEx(PCUITEMID_CHILD pidl
, const SHCOLUMNID
*pscid
, VARIANT
*pv
);
311 virtual HRESULT WINAPI
GetDetailsOf(PCUITEMID_CHILD pidl
, UINT iColumn
, SHELLDETAILS
*psd
);
312 virtual HRESULT WINAPI
MapColumnToSCID(UINT column
, SHCOLUMNID
*pscid
);
314 DECLARE_NOT_AGGREGATABLE(CRegFolder
)
316 DECLARE_PROTECT_FINAL_CONSTRUCT()
318 BEGIN_COM_MAP(CRegFolder
)
319 COM_INTERFACE_ENTRY_IID(IID_IShellFolder2
, IShellFolder2
)
320 COM_INTERFACE_ENTRY_IID(IID_IShellFolder
, IShellFolder
)
324 CRegFolder::CRegFolder()
328 CRegFolder::~CRegFolder()
332 HRESULT WINAPI
CRegFolder::Initialize(const GUID
*pGuid
, LPCITEMIDLIST pidlRoot
, LPCWSTR lpszPath
, LPCWSTR lpszEnumKeyName
)
334 memcpy(&m_guid
, pGuid
, sizeof(m_guid
));
336 m_rootPath
= lpszPath
;
338 return E_OUTOFMEMORY
;
340 m_enumKeyName
= lpszEnumKeyName
;
342 return E_OUTOFMEMORY
;
344 m_pidlRoot
.Attach(ILClone(pidlRoot
));
346 return E_OUTOFMEMORY
;
351 HRESULT
CRegFolder::GetGuidItemAttributes (LPCITEMIDLIST pidl
, LPDWORD pdwAttributes
)
353 DWORD dwAttributes
= *pdwAttributes
;
355 /* First try to get them from the registry */
356 if (!HCR_GetFolderAttributes(pidl
, pdwAttributes
))
358 /* We couldn't get anything */
362 /* Items have more attributes when on desktop */
363 if (_ILIsDesktop(m_pidlRoot
))
365 *pdwAttributes
|= (dwAttributes
& (SFGAO_CANLINK
|SFGAO_CANDELETE
|SFGAO_CANRENAME
|SFGAO_HASPROPSHEET
));
368 /* In any case, links can be created */
369 if (*pdwAttributes
== NULL
)
371 *pdwAttributes
|= (dwAttributes
& SFGAO_CANLINK
);
376 HRESULT WINAPI
CRegFolder::ParseDisplayName(HWND hwndOwner
, LPBC pbc
, LPOLESTR lpszDisplayName
,
377 ULONG
*pchEaten
, PIDLIST_RELATIVE
*ppidl
, ULONG
*pdwAttributes
)
381 if (!lpszDisplayName
|| !ppidl
)
389 UINT cch
= wcslen(lpszDisplayName
);
390 if (cch
< 39 || lpszDisplayName
[0] != L
':' || lpszDisplayName
[1] != L
':')
393 pidl
= _ILCreateGuidFromStrW(lpszDisplayName
+ 2);
400 if (pdwAttributes
&& *pdwAttributes
)
402 GetGuidItemAttributes(*ppidl
, pdwAttributes
);
407 HRESULT hr
= SHELL32_ParseNextElement(this, hwndOwner
, pbc
, &pidl
, lpszDisplayName
+ 41, pchEaten
, pdwAttributes
);
418 HRESULT WINAPI
CRegFolder::EnumObjects(HWND hwndOwner
, DWORD dwFlags
, LPENUMIDLIST
*ppEnumIDList
)
420 return ShellObjectCreatorInit
<CRegFolderEnum
>(m_enumKeyName
, dwFlags
, IID_PPV_ARG(IEnumIDList
, ppEnumIDList
));
423 HRESULT WINAPI
CRegFolder::BindToObject(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
)
425 CComPtr
<IPersistFolder
> pFolder
;
428 if (!ppvOut
|| !pidl
|| !pidl
->mkid
.cb
)
433 GUID
*pGUID
= _ILGetGUIDPointer(pidl
);
436 ERR("CRegFolder::BindToObject called for non guid item!\n");
440 hr
= SHELL32_BindToSF(m_pidlRoot
, NULL
, pidl
, pGUID
, riid
, ppvOut
);
441 if (FAILED_UNEXPECTEDLY(hr
))
447 HRESULT WINAPI
CRegFolder::BindToStorage(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
)
452 HRESULT WINAPI
CRegFolder::CompareIDs(LPARAM lParam
, PCUIDLIST_RELATIVE pidl1
, PCUIDLIST_RELATIVE pidl2
)
454 if (!pidl1
|| !pidl2
|| pidl1
->mkid
.cb
== 0 || pidl2
->mkid
.cb
== 0)
456 ERR("Got an empty pidl!\n");
460 GUID
const *clsid1
= _ILGetGUIDPointer (pidl1
);
461 GUID
const *clsid2
= _ILGetGUIDPointer (pidl2
);
463 if (!clsid1
&& !clsid2
)
465 ERR("Got no guid pidl!\n");
468 else if (clsid1
&& clsid2
)
470 if (memcmp(clsid1
, clsid2
, sizeof(GUID
)) == 0)
471 return SHELL32_CompareChildren(this, lParam
, pidl1
, pidl2
);
473 return SHELL32_CompareDetails(this, lParam
, pidl1
, pidl2
);
476 /* Guid folders come first compared to everything else */
477 return MAKE_COMPARE_HRESULT(clsid1
? -1 : 1);
480 HRESULT WINAPI
CRegFolder::CreateViewObject(HWND hwndOwner
, REFIID riid
, LPVOID
*ppvOut
)
485 HRESULT WINAPI
CRegFolder::GetAttributesOf(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, DWORD
*rgfInOut
)
487 if (!rgfInOut
|| !cidl
|| !apidl
)
493 while(cidl
> 0 && *apidl
)
495 if (_ILIsSpecialFolder(*apidl
))
496 GetGuidItemAttributes(*apidl
, rgfInOut
);
498 ERR("Got an unkown pidl here!\n");
503 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
504 *rgfInOut
&= ~SFGAO_VALIDATE
;
509 HRESULT WINAPI
CRegFolder::GetUIObjectOf(HWND hwndOwner
, UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
,
510 REFIID riid
, UINT
* prgfInOut
, LPVOID
* ppvOut
)
513 HRESULT hr
= E_INVALIDARG
;
520 if ((IsEqualIID (riid
, IID_IExtractIconA
) || IsEqualIID (riid
, IID_IExtractIconW
)) && (cidl
== 1))
522 hr
= CGuidItemExtractIcon_CreateInstance(apidl
[0], riid
, &pObj
);
524 else if (IsEqualIID (riid
, IID_IContextMenu
) && (cidl
>= 1))
526 if (!_ILGetGUIDPointer (apidl
[0]))
528 ERR("Got non guid item!\n");
532 hr
= CGuidItemContextMenu_CreateInstance(m_pidlRoot
, hwndOwner
, cidl
, apidl
, static_cast<IShellFolder
*>(this), (IContextMenu
**)&pObj
);
534 else if (IsEqualIID (riid
, IID_IDataObject
) && (cidl
>= 1))
536 hr
= IDataObject_Constructor (hwndOwner
, m_pidlRoot
, apidl
, cidl
, TRUE
, (IDataObject
**)&pObj
);
548 HRESULT WINAPI
CRegFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl
, DWORD dwFlags
, LPSTRRET strRet
)
550 if (!strRet
|| (!_ILIsSpecialFolder(pidl
) && pidl
!= NULL
))
553 if (!pidl
|| !pidl
->mkid
.cb
)
555 if ((GET_SHGDN_RELATION(dwFlags
) == SHGDN_NORMAL
) && (GET_SHGDN_FOR(dwFlags
) & SHGDN_FORPARSING
))
557 LPWSTR pszPath
= (LPWSTR
)CoTaskMemAlloc((MAX_PATH
+ 1) * sizeof(WCHAR
));
559 return E_OUTOFMEMORY
;
561 /* parsing name like ::{...} */
564 SHELL32_GUIDToStringW(m_guid
, &pszPath
[2]);
566 strRet
->uType
= STRRET_WSTR
;
567 strRet
->pOleStr
= pszPath
;
574 WCHAR wstrName
[MAX_PATH
+1];
575 bRet
= HCR_GetClassNameW(m_guid
, wstrName
, MAX_PATH
);
579 return SHSetStrRet(strRet
, wstrName
);
585 GUID
const *clsid
= _ILGetGUIDPointer (pidl
);
587 /* First of all check if we need to query the name from the child item */
588 if (GET_SHGDN_FOR (dwFlags
) == SHGDN_FORPARSING
&&
589 GET_SHGDN_RELATION (dwFlags
) == SHGDN_NORMAL
)
591 int bWantsForParsing
= FALSE
;
594 * We can only get a filesystem path from a shellfolder if the
595 * value WantsFORPARSING in CLSID\\{...}\\shellfolder exists.
597 * Exception: The MyComputer folder doesn't have this key,
598 * but any other filesystem backed folder it needs it.
600 if (IsEqualIID (*clsid
, CLSID_MyComputer
))
602 bWantsForParsing
= TRUE
;
607 if (HCR_RegOpenClassIDKey(*clsid
, &hkeyClass
))
609 LONG res
= SHGetValueW(hkeyClass
, L
"Shellfolder", L
"WantsForParsing", NULL
, NULL
, NULL
);
610 bWantsForParsing
= (res
== ERROR_SUCCESS
);
611 RegCloseKey(hkeyClass
);
615 if (bWantsForParsing
)
618 * we need the filesystem path to the destination folder.
619 * Only the folder itself can know it
621 return SHELL32_GetDisplayNameOfChild (this, pidl
, dwFlags
, strRet
);
625 /* Allocate the buffer for the result */
626 LPWSTR pszPath
= (LPWSTR
)CoTaskMemAlloc((MAX_PATH
+ 1) * sizeof(WCHAR
));
628 return E_OUTOFMEMORY
;
632 if (GET_SHGDN_FOR (dwFlags
) == SHGDN_FORPARSING
)
634 wcscpy(pszPath
, m_rootPath
);
635 PWCHAR pItemName
= &pszPath
[wcslen(pszPath
)];
637 /* parsing name like ::{...} */
640 SHELL32_GUIDToStringW (*clsid
, &pItemName
[2]);
644 /* user friendly name */
645 if (!HCR_GetClassNameW (*clsid
, pszPath
, MAX_PATH
))
651 strRet
->uType
= STRRET_WSTR
;
652 strRet
->pOleStr
= pszPath
;
656 CoTaskMemFree(pszPath
);
662 HRESULT WINAPI
CRegFolder::SetNameOf(HWND hwndOwner
, PCUITEMID_CHILD pidl
, /* simple pidl */
663 LPCOLESTR lpName
, DWORD dwFlags
, PITEMID_CHILD
*pPidlOut
)
665 GUID
const *clsid
= _ILGetGUIDPointer (pidl
);
672 ERR("Pidl is not reg item!\n");
676 hr
= StringFromCLSID(*clsid
, &pStr
);
677 if (FAILED_UNEXPECTEDLY(hr
))
680 swprintf(szName
, L
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\%s", pStr
);
682 DWORD cbData
= (wcslen(lpName
) + 1) * sizeof(WCHAR
);
683 LONG res
= SHSetValueW(HKEY_CURRENT_USER
, szName
, NULL
, RRF_RT_REG_SZ
, lpName
, cbData
);
687 if (res
== ERROR_SUCCESS
)
689 *pPidlOut
= ILClone(pidl
);
697 HRESULT WINAPI
CRegFolder::GetDefaultSearchGUID(GUID
*pguid
)
702 HRESULT WINAPI
CRegFolder::EnumSearches(IEnumExtraSearch
** ppenum
)
707 HRESULT WINAPI
CRegFolder::GetDefaultColumn(DWORD dwRes
, ULONG
*pSort
, ULONG
*pDisplay
)
717 HRESULT WINAPI
CRegFolder::GetDefaultColumnState(UINT iColumn
, DWORD
*pcsFlags
)
721 *pcsFlags
= SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
;
725 HRESULT WINAPI
CRegFolder::GetDetailsEx(PCUITEMID_CHILD pidl
, const SHCOLUMNID
*pscid
, VARIANT
*pv
)
730 HRESULT WINAPI
CRegFolder::GetDetailsOf(PCUITEMID_CHILD pidl
, UINT iColumn
, SHELLDETAILS
*psd
)
735 GUID
const *clsid
= _ILGetGUIDPointer (pidl
);
739 ERR("Pidl is not reg item!\n");
745 /* Return an empty string when we area asked for a column we don't support.
746 Only the regfolder is supposed to do this as it supports less columns compared to other folder
747 and its contents are supposed to be presented alongside items that support more columns. */
748 return SHSetStrRet(&psd
->str
, "");
754 return GetDisplayNameOf(pidl
, SHGDN_NORMAL
| SHGDN_INFOLDER
, &psd
->str
);
755 case 1: /* comments */
757 if (!HCR_RegOpenClassIDKey(*clsid
, &hKey
))
758 return SHSetStrRet(&psd
->str
, "");
760 psd
->str
.cStr
[0] = 0x00;
761 psd
->str
.uType
= STRRET_CSTR
;
762 RegLoadMUIStringA(hKey
, "InfoTip", psd
->str
.cStr
, MAX_PATH
, NULL
, 0, NULL
);
766 //return SHSetStrRet(&psd->str, resource_id); /* FIXME: translate */
767 return SHSetStrRet(&psd
->str
, "System Folder");
772 HRESULT WINAPI
CRegFolder::MapColumnToSCID(UINT column
, SHCOLUMNID
*pscid
)
777 /* In latest windows version this is exported but it takes different arguments! */
778 HRESULT
CRegFolder_CreateInstance(const GUID
*pGuid
, LPCITEMIDLIST pidlRoot
, LPCWSTR lpszPath
, LPCWSTR lpszEnumKeyName
, REFIID riid
, void **ppv
)
780 return ShellObjectCreatorInit
<CRegFolder
>(pGuid
, pidlRoot
, lpszPath
, lpszEnumKeyName
, riid
, ppv
);