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
)ShellExecuteW(hwnd
, L
"open", L
"rundll32.exe shell32.dll,Control_RunDLL sysdm.cpl", NULL
, NULL
, SW_SHOWNORMAL
))
47 else if (_ILIsDesktop(apidl
[0]))
49 if (32 >= (UINT
)ShellExecuteW(hwnd
, L
"open", L
"rundll32.exe shell32.dll,Control_RunDLL desk.cpl", NULL
, NULL
, SW_SHOWNORMAL
))
52 else if (_ILIsNetHood(apidl
[0]))
55 if (32 >= (UINT
)ShellExecuteW(NULL
, L
"open", L
"explorer.exe",
56 L
"::{7007ACC7-3202-11D1-AAD2-00805FC1270E}",
57 NULL
, SW_SHOWDEFAULT
))
60 else if (_ILIsBitBucket(apidl
[0]))
62 /* FIXME: detect the drive path of bitbucket if appropiate */
63 if (!SH_ShowRecycleBinProperties(L
'C'))
68 _ILFreeaPidl(apidl
, cidl
);
73 HRESULT
CGuidItemContextMenu_CreateInstance(PCIDLIST_ABSOLUTE pidlFolder
,
76 PCUITEMID_CHILD_ARRAY apidl
,
83 GUID
*pGuid
= _ILGetGUIDPointer(apidl
[0]);
89 wcscpy(key
, L
"CLSID\\");
90 HRESULT hr
= StringFromCLSID(*pGuid
, &pwszCLSID
);
93 wcscpy(&key
[6], pwszCLSID
);
94 AddClassKeyToArray(key
, hKeys
, &cKeys
);
97 AddClassKeyToArray(L
"Folder", hKeys
, &cKeys
);
99 return CDefFolderMenu_Create2(pidlFolder
, hwnd
, cidl
, apidl
, psf
, RegFolderContextMenuCallback
, cKeys
, hKeys
, ppcm
);
102 HRESULT
CGuidItemExtractIcon_CreateInstance(LPCITEMIDLIST pidl
, REFIID iid
, LPVOID
* ppvOut
)
104 CComPtr
<IDefaultExtractIconInit
> initIcon
;
108 WCHAR wTemp
[MAX_PATH
];
110 hr
= SHCreateDefaultExtractIcon(IID_PPV_ARG(IDefaultExtractIconInit
,&initIcon
));
114 if (_ILIsDesktop(pidl
))
116 initIcon
->SetNormalIcon(swShell32Name
, -IDI_SHELL_DESKTOP
);
117 return initIcon
->QueryInterface(iid
, ppvOut
);
120 riid
= _ILGetGUIDPointer(pidl
);
124 /* my computer and other shell extensions */
125 static const WCHAR fmt
[] = { 'C', 'L', 'S', 'I', 'D', '\\',
126 '{', '%', '0', '8', 'l', 'x', '-', '%', '0', '4', 'x', '-', '%', '0', '4', 'x', '-',
127 '%', '0', '2', 'x', '%', '0', '2', 'x', '-', '%', '0', '2', 'x', '%', '0', '2', 'x',
128 '%', '0', '2', 'x', '%', '0', '2', 'x', '%', '0', '2', 'x', '%', '0', '2', 'x', '}', 0
133 riid
->Data1
, riid
->Data2
, riid
->Data3
,
134 riid
->Data4
[0], riid
->Data4
[1], riid
->Data4
[2], riid
->Data4
[3],
135 riid
->Data4
[4], riid
->Data4
[5], riid
->Data4
[6], riid
->Data4
[7]);
137 const WCHAR
* iconname
= NULL
;
138 if (_ILIsBitBucket(pidl
))
140 static const WCHAR szFull
[] = {'F','u','l','l',0};
141 static const WCHAR szEmpty
[] = {'E','m','p','t','y',0};
142 CComPtr
<IEnumIDList
> EnumIDList
;
145 CComPtr
<IShellFolder2
> psfRecycleBin
;
146 CComPtr
<IShellFolder
> psfDesktop
;
147 hr
= SHGetDesktopFolder(&psfDesktop
);
150 hr
= psfDesktop
->BindToObject(pidl
, NULL
, IID_PPV_ARG(IShellFolder2
, &psfRecycleBin
));
152 hr
= psfRecycleBin
->EnumObjects(NULL
, SHCONTF_FOLDERS
| SHCONTF_NONFOLDERS
, &EnumIDList
);
155 LPITEMIDLIST pidl
= NULL
;
156 if (SUCCEEDED(hr
) && (hr
= EnumIDList
->Next(1, &pidl
, &itemcount
)) == S_OK
)
165 if (HCR_GetIconW(xriid
, wTemp
, iconname
, MAX_PATH
, &icon_idx
))
167 initIcon
->SetNormalIcon(wTemp
, icon_idx
);
171 if (IsEqualGUID(*riid
, CLSID_MyComputer
))
172 initIcon
->SetNormalIcon(swShell32Name
, -IDI_SHELL_MY_COMPUTER
);
173 else if (IsEqualGUID(*riid
, CLSID_MyDocuments
))
174 initIcon
->SetNormalIcon(swShell32Name
, -IDI_SHELL_MY_DOCUMENTS
);
175 else if (IsEqualGUID(*riid
, CLSID_NetworkPlaces
))
176 initIcon
->SetNormalIcon(swShell32Name
, -IDI_SHELL_MY_NETWORK_PLACES
);
178 initIcon
->SetNormalIcon(swShell32Name
, -IDI_SHELL_FOLDER
);
181 return initIcon
->QueryInterface(iid
, ppvOut
);
184 class CRegFolderEnum
:
185 public CEnumIDListBase
190 HRESULT
Initialize(LPCWSTR lpszEnumKeyName
, DWORD dwFlags
);
191 HRESULT
AddItemsFromKey(HKEY hkey_root
, LPCWSTR szRepPath
);
193 BEGIN_COM_MAP(CRegFolderEnum
)
194 COM_INTERFACE_ENTRY_IID(IID_IEnumIDList
, IEnumIDList
)
198 CRegFolderEnum::CRegFolderEnum()
202 CRegFolderEnum::~CRegFolderEnum()
206 HRESULT
CRegFolderEnum::Initialize(LPCWSTR lpszEnumKeyName
, DWORD dwFlags
)
208 WCHAR KeyName
[MAX_PATH
];
209 static const WCHAR KeyNameFormat
[] = L
"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\%s\\Namespace";
211 if (!(dwFlags
& SHCONTF_FOLDERS
))
214 HRESULT hr
= StringCchPrintfW(KeyName
, MAX_PATH
, KeyNameFormat
, lpszEnumKeyName
);
215 if (FAILED_UNEXPECTEDLY(hr
))
218 AddItemsFromKey(HKEY_LOCAL_MACHINE
, KeyName
);
219 AddItemsFromKey(HKEY_CURRENT_USER
, KeyName
);
224 HRESULT
CRegFolderEnum::AddItemsFromKey(HKEY hkey_root
, LPCWSTR szRepPath
)
226 WCHAR name
[MAX_PATH
];
229 if (RegOpenKeyW(hkey_root
, szRepPath
, &hkey
) != ERROR_SUCCESS
)
232 for (int idx
= 0; ; idx
++)
234 if (RegEnumKeyW(hkey
, idx
, name
, MAX_PATH
) != ERROR_SUCCESS
)
237 /* If the name of the key is not a guid try to get the default value of the key */
240 DWORD dwSize
= sizeof(name
);
241 RegGetValueW(hkey
, name
, NULL
, RRF_RT_REG_SZ
, NULL
, name
, &dwSize
);
246 LPITEMIDLIST pidl
= _ILCreateGuidFromStrW(name
);
259 public CComObjectRootEx
<CComMultiThreadModelNoCS
>,
264 CAtlStringW m_rootPath
;
265 CAtlStringW m_enumKeyName
;
266 CComHeapPtr
<ITEMIDLIST
> m_pidlRoot
;
268 HRESULT
GetGuidItemAttributes (LPCITEMIDLIST pidl
, LPDWORD pdwAttributes
);
272 HRESULT WINAPI
Initialize(const GUID
*pGuid
, LPCITEMIDLIST pidlRoot
, LPCWSTR lpszPath
, LPCWSTR lpszEnumKeyName
);
275 virtual HRESULT WINAPI
ParseDisplayName(HWND hwndOwner
, LPBC pbc
, LPOLESTR lpszDisplayName
, ULONG
*pchEaten
, PIDLIST_RELATIVE
*ppidl
, ULONG
*pdwAttributes
);
276 virtual HRESULT WINAPI
EnumObjects(HWND hwndOwner
, DWORD dwFlags
, LPENUMIDLIST
*ppEnumIDList
);
277 virtual HRESULT WINAPI
BindToObject(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
);
278 virtual HRESULT WINAPI
BindToStorage(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
);
279 virtual HRESULT WINAPI
CompareIDs(LPARAM lParam
, PCUIDLIST_RELATIVE pidl1
, PCUIDLIST_RELATIVE pidl2
);
280 virtual HRESULT WINAPI
CreateViewObject(HWND hwndOwner
, REFIID riid
, LPVOID
*ppvOut
);
281 virtual HRESULT WINAPI
GetAttributesOf(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, DWORD
*rgfInOut
);
282 virtual HRESULT WINAPI
GetUIObjectOf(HWND hwndOwner
, UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, REFIID riid
, UINT
* prgfInOut
, LPVOID
* ppvOut
);
283 virtual HRESULT WINAPI
GetDisplayNameOf(PCUITEMID_CHILD pidl
, DWORD dwFlags
, LPSTRRET strRet
);
284 virtual HRESULT WINAPI
SetNameOf(HWND hwndOwner
, PCUITEMID_CHILD pidl
, LPCOLESTR lpName
, DWORD dwFlags
, PITEMID_CHILD
*pPidlOut
);
287 virtual HRESULT WINAPI
GetDefaultSearchGUID(GUID
*pguid
);
288 virtual HRESULT WINAPI
EnumSearches(IEnumExtraSearch
**ppenum
);
289 virtual HRESULT WINAPI
GetDefaultColumn(DWORD dwRes
, ULONG
*pSort
, ULONG
*pDisplay
);
290 virtual HRESULT WINAPI
GetDefaultColumnState(UINT iColumn
, DWORD
*pcsFlags
);
291 virtual HRESULT WINAPI
GetDetailsEx(PCUITEMID_CHILD pidl
, const SHCOLUMNID
*pscid
, VARIANT
*pv
);
292 virtual HRESULT WINAPI
GetDetailsOf(PCUITEMID_CHILD pidl
, UINT iColumn
, SHELLDETAILS
*psd
);
293 virtual HRESULT WINAPI
MapColumnToSCID(UINT column
, SHCOLUMNID
*pscid
);
295 DECLARE_NOT_AGGREGATABLE(CRegFolder
)
297 DECLARE_PROTECT_FINAL_CONSTRUCT()
299 BEGIN_COM_MAP(CRegFolder
)
300 COM_INTERFACE_ENTRY_IID(IID_IShellFolder2
, IShellFolder2
)
301 COM_INTERFACE_ENTRY_IID(IID_IShellFolder
, IShellFolder
)
305 CRegFolder::CRegFolder()
309 CRegFolder::~CRegFolder()
313 HRESULT WINAPI
CRegFolder::Initialize(const GUID
*pGuid
, LPCITEMIDLIST pidlRoot
, LPCWSTR lpszPath
, LPCWSTR lpszEnumKeyName
)
315 memcpy(&m_guid
, pGuid
, sizeof(m_guid
));
317 m_rootPath
= lpszPath
;
319 return E_OUTOFMEMORY
;
321 m_enumKeyName
= lpszEnumKeyName
;
323 return E_OUTOFMEMORY
;
325 m_pidlRoot
.Attach(ILClone(pidlRoot
));
327 return E_OUTOFMEMORY
;
332 HRESULT
CRegFolder::GetGuidItemAttributes (LPCITEMIDLIST pidl
, LPDWORD pdwAttributes
)
334 DWORD dwAttributes
= *pdwAttributes
;
336 /* First try to get them from the registry */
337 if (!HCR_GetFolderAttributes(pidl
, pdwAttributes
))
339 /* We couldn't get anything */
343 /* Items have more attributes when on desktop */
344 if (_ILIsDesktop(m_pidlRoot
))
346 *pdwAttributes
|= (dwAttributes
& (SFGAO_CANLINK
|SFGAO_CANDELETE
|SFGAO_CANRENAME
|SFGAO_HASPROPSHEET
));
349 /* In any case, links can be created */
350 if (*pdwAttributes
== NULL
)
352 *pdwAttributes
|= (dwAttributes
& SFGAO_CANLINK
);
357 HRESULT WINAPI
CRegFolder::ParseDisplayName(HWND hwndOwner
, LPBC pbc
, LPOLESTR lpszDisplayName
,
358 ULONG
*pchEaten
, PIDLIST_RELATIVE
*ppidl
, ULONG
*pdwAttributes
)
362 if (!lpszDisplayName
|| !ppidl
)
370 UINT cch
= wcslen(lpszDisplayName
);
371 if (cch
< 39 || lpszDisplayName
[0] != L
':' || lpszDisplayName
[1] != L
':')
374 pidl
= _ILCreateGuidFromStrW(lpszDisplayName
+ 2);
381 if (pdwAttributes
&& *pdwAttributes
)
383 GetGuidItemAttributes(*ppidl
, pdwAttributes
);
388 HRESULT hr
= SHELL32_ParseNextElement(this, hwndOwner
, pbc
, &pidl
, lpszDisplayName
+ 41, pchEaten
, pdwAttributes
);
399 HRESULT WINAPI
CRegFolder::EnumObjects(HWND hwndOwner
, DWORD dwFlags
, LPENUMIDLIST
*ppEnumIDList
)
401 return ShellObjectCreatorInit
<CRegFolderEnum
>(m_enumKeyName
, dwFlags
, IID_PPV_ARG(IEnumIDList
, ppEnumIDList
));
404 HRESULT WINAPI
CRegFolder::BindToObject(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
)
406 CComPtr
<IPersistFolder
> pFolder
;
409 if (!ppvOut
|| !pidl
|| !pidl
->mkid
.cb
)
414 GUID
*pGUID
= _ILGetGUIDPointer(pidl
);
417 ERR("CRegFolder::BindToObject called for non guid item!\n");
421 hr
= SHELL32_BindToSF(m_pidlRoot
, NULL
, pidl
, pGUID
, riid
, ppvOut
);
422 if (FAILED_UNEXPECTEDLY(hr
))
428 HRESULT WINAPI
CRegFolder::BindToStorage(PCUIDLIST_RELATIVE pidl
, LPBC pbcReserved
, REFIID riid
, LPVOID
*ppvOut
)
433 HRESULT WINAPI
CRegFolder::CompareIDs(LPARAM lParam
, PCUIDLIST_RELATIVE pidl1
, PCUIDLIST_RELATIVE pidl2
)
435 if (!pidl1
|| !pidl2
|| pidl1
->mkid
.cb
== 0 || pidl2
->mkid
.cb
== 0)
437 ERR("Got an empty pidl!\n");
441 GUID
const *clsid1
= _ILGetGUIDPointer (pidl1
);
442 GUID
const *clsid2
= _ILGetGUIDPointer (pidl2
);
444 if (!clsid1
&& !clsid2
)
446 ERR("Got no guid pidl!\n");
449 else if (clsid1
&& clsid2
)
451 if (memcmp(clsid1
, clsid2
, sizeof(GUID
)) == 0)
452 return SHELL32_CompareChildren(this, lParam
, pidl1
, pidl2
);
454 return SHELL32_CompareDetails(this, lParam
, pidl1
, pidl2
);
457 /* Guid folders come first compared to everything else */
458 return MAKE_COMPARE_HRESULT(clsid1
? -1 : 1);
461 HRESULT WINAPI
CRegFolder::CreateViewObject(HWND hwndOwner
, REFIID riid
, LPVOID
*ppvOut
)
466 HRESULT WINAPI
CRegFolder::GetAttributesOf(UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
, DWORD
*rgfInOut
)
468 if (!rgfInOut
|| !cidl
|| !apidl
)
474 while(cidl
> 0 && *apidl
)
476 if (_ILIsSpecialFolder(*apidl
))
477 GetGuidItemAttributes(*apidl
, rgfInOut
);
479 ERR("Got an unkown pidl here!\n");
484 /* make sure SFGAO_VALIDATE is cleared, some apps depend on that */
485 *rgfInOut
&= ~SFGAO_VALIDATE
;
490 HRESULT WINAPI
CRegFolder::GetUIObjectOf(HWND hwndOwner
, UINT cidl
, PCUITEMID_CHILD_ARRAY apidl
,
491 REFIID riid
, UINT
* prgfInOut
, LPVOID
* ppvOut
)
494 HRESULT hr
= E_INVALIDARG
;
501 if ((IsEqualIID (riid
, IID_IExtractIconA
) || IsEqualIID (riid
, IID_IExtractIconW
)) && (cidl
== 1))
503 hr
= CGuidItemExtractIcon_CreateInstance(apidl
[0], riid
, &pObj
);
505 else if (IsEqualIID (riid
, IID_IContextMenu
) && (cidl
>= 1))
507 if (!_ILGetGUIDPointer (apidl
[0]))
509 ERR("Got non guid item!\n");
513 hr
= CGuidItemContextMenu_CreateInstance(m_pidlRoot
, hwndOwner
, cidl
, apidl
, static_cast<IShellFolder
*>(this), (IContextMenu
**)&pObj
);
515 else if (IsEqualIID (riid
, IID_IDataObject
) && (cidl
>= 1))
517 hr
= IDataObject_Constructor (hwndOwner
, m_pidlRoot
, apidl
, cidl
, (IDataObject
**)&pObj
);
529 HRESULT WINAPI
CRegFolder::GetDisplayNameOf(PCUITEMID_CHILD pidl
, DWORD dwFlags
, LPSTRRET strRet
)
531 if (!strRet
|| (!_ILIsSpecialFolder(pidl
) && pidl
!= NULL
))
534 if (!pidl
|| !pidl
->mkid
.cb
)
536 if ((GET_SHGDN_RELATION(dwFlags
) == SHGDN_NORMAL
) && (GET_SHGDN_FOR(dwFlags
) & SHGDN_FORPARSING
))
538 LPWSTR pszPath
= (LPWSTR
)CoTaskMemAlloc((MAX_PATH
+ 1) * sizeof(WCHAR
));
540 return E_OUTOFMEMORY
;
542 /* parsing name like ::{...} */
545 SHELL32_GUIDToStringW(m_guid
, &pszPath
[2]);
547 strRet
->uType
= STRRET_WSTR
;
548 strRet
->pOleStr
= pszPath
;
555 WCHAR wstrName
[MAX_PATH
+1];
556 bRet
= HCR_GetClassNameW(m_guid
, wstrName
, MAX_PATH
);
560 return SHSetStrRet(strRet
, wstrName
);
566 GUID
const *clsid
= _ILGetGUIDPointer (pidl
);
568 /* First of all check if we need to query the name from the child item */
569 if (GET_SHGDN_FOR (dwFlags
) == SHGDN_FORPARSING
&&
570 GET_SHGDN_RELATION (dwFlags
) == SHGDN_NORMAL
)
572 int bWantsForParsing
= FALSE
;
575 * We can only get a filesystem path from a shellfolder if the
576 * value WantsFORPARSING in CLSID\\{...}\\shellfolder exists.
578 * Exception: The MyComputer folder doesn't have this key,
579 * but any other filesystem backed folder it needs it.
581 if (IsEqualIID (*clsid
, CLSID_MyComputer
))
583 bWantsForParsing
= TRUE
;
588 if (HCR_RegOpenClassIDKey(*clsid
, &hkeyClass
))
590 LONG res
= SHGetValueW(hkeyClass
, L
"Shellfolder", L
"WantsForParsing", NULL
, NULL
, NULL
);
591 bWantsForParsing
= (res
== ERROR_SUCCESS
);
592 RegCloseKey(hkeyClass
);
596 if (bWantsForParsing
)
599 * we need the filesystem path to the destination folder.
600 * Only the folder itself can know it
602 return SHELL32_GetDisplayNameOfChild (this, pidl
, dwFlags
, strRet
);
606 /* Allocate the buffer for the result */
607 LPWSTR pszPath
= (LPWSTR
)CoTaskMemAlloc((MAX_PATH
+ 1) * sizeof(WCHAR
));
609 return E_OUTOFMEMORY
;
613 if (GET_SHGDN_FOR (dwFlags
) == SHGDN_FORPARSING
)
615 wcscpy(pszPath
, m_rootPath
);
616 PWCHAR pItemName
= &pszPath
[wcslen(pszPath
)];
618 /* parsing name like ::{...} */
621 SHELL32_GUIDToStringW (*clsid
, &pItemName
[2]);
625 /* user friendly name */
626 if (!HCR_GetClassNameW (*clsid
, pszPath
, MAX_PATH
))
632 strRet
->uType
= STRRET_WSTR
;
633 strRet
->pOleStr
= pszPath
;
637 CoTaskMemFree(pszPath
);
643 HRESULT WINAPI
CRegFolder::SetNameOf(HWND hwndOwner
, PCUITEMID_CHILD pidl
, /* simple pidl */
644 LPCOLESTR lpName
, DWORD dwFlags
, PITEMID_CHILD
*pPidlOut
)
646 GUID
const *clsid
= _ILGetGUIDPointer (pidl
);
653 ERR("Pidl is not reg item!\n");
657 hr
= StringFromCLSID(*clsid
, &pStr
);
658 if (FAILED_UNEXPECTEDLY(hr
))
661 swprintf(szName
, L
"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\CLSID\\%s", pStr
);
663 DWORD cbData
= (wcslen(lpName
) + 1) * sizeof(WCHAR
);
664 LONG res
= SHSetValueW(HKEY_CURRENT_USER
, szName
, NULL
, RRF_RT_REG_SZ
, lpName
, cbData
);
668 if (res
== ERROR_SUCCESS
)
670 *pPidlOut
= ILClone(pidl
);
678 HRESULT WINAPI
CRegFolder::GetDefaultSearchGUID(GUID
*pguid
)
683 HRESULT WINAPI
CRegFolder::EnumSearches(IEnumExtraSearch
** ppenum
)
688 HRESULT WINAPI
CRegFolder::GetDefaultColumn(DWORD dwRes
, ULONG
*pSort
, ULONG
*pDisplay
)
698 HRESULT WINAPI
CRegFolder::GetDefaultColumnState(UINT iColumn
, DWORD
*pcsFlags
)
702 *pcsFlags
= SHCOLSTATE_TYPE_STR
| SHCOLSTATE_ONBYDEFAULT
;
706 HRESULT WINAPI
CRegFolder::GetDetailsEx(PCUITEMID_CHILD pidl
, const SHCOLUMNID
*pscid
, VARIANT
*pv
)
711 HRESULT WINAPI
CRegFolder::GetDetailsOf(PCUITEMID_CHILD pidl
, UINT iColumn
, SHELLDETAILS
*psd
)
716 GUID
const *clsid
= _ILGetGUIDPointer (pidl
);
720 ERR("Pidl is not reg item!\n");
726 /* Return an empty string when we area asked for a column we don't support.
727 Only the regfolder is supposed to do this as it supports less columns compared to other folder
728 and its contents are supposed to be presented alongside items that support more columns. */
729 return SHSetStrRet(&psd
->str
, "");
735 return GetDisplayNameOf(pidl
, SHGDN_NORMAL
| SHGDN_INFOLDER
, &psd
->str
);
736 case 1: /* comments */
738 if (!HCR_RegOpenClassIDKey(*clsid
, &hKey
))
739 return SHSetStrRet(&psd
->str
, "");
741 psd
->str
.cStr
[0] = 0x00;
742 psd
->str
.uType
= STRRET_CSTR
;
743 RegLoadMUIStringA(hKey
, "InfoTip", psd
->str
.cStr
, MAX_PATH
, NULL
, 0, NULL
);
747 //return SHSetStrRet(&psd->str, resource_id); /* FIXME: translate */
748 return SHSetStrRet(&psd
->str
, "System Folder");
753 HRESULT WINAPI
CRegFolder::MapColumnToSCID(UINT column
, SHCOLUMNID
*pscid
)
758 /* In latest windows version this is exported but it takes different arguments! */
759 HRESULT
CRegFolder_CreateInstance(const GUID
*pGuid
, LPCITEMIDLIST pidlRoot
, LPCWSTR lpszPath
, LPCWSTR lpszEnumKeyName
, REFIID riid
, void **ppv
)
761 return ShellObjectCreatorInit
<CRegFolder
>(pGuid
, pidlRoot
, lpszPath
, lpszEnumKeyName
, riid
, ppv
);