/* Undocumented functions from shdocvw */
extern "C" HRESULT WINAPI IEParseDisplayNameWithBCW(DWORD codepage, LPCWSTR lpszDisplayName, LPBC pbc, LPITEMIDLIST *ppidl);
-class CDesktopFolderEnum :
- public CEnumIDListBase
-{
- private:
-// CComPtr fDesktopEnumerator;
-// CComPtr fCommonDesktopEnumerator;
- public:
- CDesktopFolderEnum();
- ~CDesktopFolderEnum();
- HRESULT WINAPI Initialize(CDesktopFolder *desktopFolder, HWND hwndOwner, DWORD dwFlags);
-
- BEGIN_COM_MAP(CDesktopFolderEnum)
- COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList)
- END_COM_MAP()
-};
-
-int SHELL_ConfirmMsgBox(HWND hWnd, LPWSTR lpszText, LPWSTR lpszCaption, HICON hIcon, BOOL bYesToAll);
-
-static const shvheader DesktopSFHeader[] = {
- {IDS_SHV_COLUMN_NAME, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15},
- {IDS_SHV_COLUMN_COMMENTS, SHCOLSTATE_TYPE_STR, LVCFMT_LEFT, 10},
- {IDS_SHV_COLUMN_TYPE, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 10},
- {IDS_SHV_COLUMN_SIZE, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10},
- {IDS_SHV_COLUMN_MODIFIED, SHCOLSTATE_TYPE_DATE | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 12},
- {IDS_SHV_COLUMN_ATTRIBUTES, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 10}
-};
-
-#define DESKTOPSHELLVIEWCOLUMNS 6
-
-static const DWORD dwDesktopAttributes =
- SFGAO_HASSUBFOLDER | SFGAO_FILESYSTEM | SFGAO_FOLDER | SFGAO_FILESYSANCESTOR |
- SFGAO_STORAGEANCESTOR | SFGAO_HASPROPSHEET | SFGAO_STORAGE | SFGAO_CANLINK;
-static const DWORD dwMyComputerAttributes =
- SFGAO_CANRENAME | SFGAO_CANDELETE | SFGAO_HASPROPSHEET | SFGAO_DROPTARGET |
- SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_HASSUBFOLDER | SFGAO_CANLINK;
-static DWORD dwMyNetPlacesAttributes =
- SFGAO_CANRENAME | SFGAO_CANDELETE | SFGAO_HASPROPSHEET | SFGAO_DROPTARGET |
- SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_HASSUBFOLDER | SFGAO_CANLINK;
-
-
-CDesktopFolderEnum::CDesktopFolderEnum()
-{
-}
-
-CDesktopFolderEnum::~CDesktopFolderEnum()
-{
-}
-
static const WCHAR ClassicStartMenuW[] = L"SOFTWARE\\Microsoft\\Windows\\"
L"CurrentVersion\\Explorer\\HideDesktopIcons\\ClassicStartMenu";
return Result;
}
-/**************************************************************************
- * CreateDesktopEnumList()
- */
-
-HRESULT WINAPI CDesktopFolderEnum::Initialize(CDesktopFolder *desktopFolder, HWND hwndOwner, DWORD dwFlags)
+static INT IsNamespaceExtensionHidden(LPCITEMIDLIST pidl)
{
- BOOL ret = TRUE;
- WCHAR szPath[MAX_PATH];
-
- static const WCHAR MyDocumentsClassString[] = L"{450D8FBA-AD25-11D0-98A8-0800361B1103}";
- static const WCHAR Desktop_NameSpaceW[] = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Desktop\\Namespace";
-
- TRACE("(%p)->(flags=0x%08x)\n", this, dwFlags);
+ GUID const *clsid = _ILGetGUIDPointer (pidl);
+ if (!clsid)
+ return -1;
- /* enumerate the root folders */
- if (dwFlags & SHCONTF_FOLDERS)
- {
- HKEY hkey;
- UINT i;
- DWORD dwResult;
+ WCHAR pwszGuid[CHARS_IN_GUID];
+ SHELL32_GUIDToStringW(*clsid, pwszGuid);
+ return IsNamespaceExtensionHidden(pwszGuid);
+}
- /* create the pidl for This item */
- if (IsNamespaceExtensionHidden(MyDocumentsClassString) < 1)
+class CDesktopFolderEnum :
+ public CEnumIDListBase
+{
+ private:
+// CComPtr fDesktopEnumerator;
+// CComPtr fCommonDesktopEnumerator;
+ public:
+ HRESULT WINAPI Initialize(DWORD dwFlags,IEnumIDList * pRegEnumerator, IEnumIDList *pDesktopEnumerator, IEnumIDList *pCommonDesktopEnumerator)
{
- ret = AddToEnumList(_ILCreateMyDocuments());
- }
- ret = AddToEnumList(_ILCreateMyComputer());
+ BOOL ret = TRUE;
+ LPITEMIDLIST pidl;
- for (i = 0; i < 2; i++)
- {
- if (i == 0)
- dwResult = RegOpenKeyExW(HKEY_LOCAL_MACHINE, Desktop_NameSpaceW, 0, KEY_READ, &hkey);
- else
- dwResult = RegOpenKeyExW(HKEY_CURRENT_USER, Desktop_NameSpaceW, 0, KEY_READ, &hkey);
+ static const WCHAR MyDocumentsClassString[] = L"{450D8FBA-AD25-11D0-98A8-0800361B1103}";
+
+ TRACE("(%p)->(flags=0x%08x)\n", this, dwFlags);
- if (dwResult == ERROR_SUCCESS)
+ /* enumerate the root folders */
+ if (dwFlags & SHCONTF_FOLDERS)
{
- WCHAR iid[50];
- LPITEMIDLIST pidl;
- int i = 0;
+ AddToEnumList(_ILCreateMyComputer());
+ if (IsNamespaceExtensionHidden(MyDocumentsClassString) < 1)
+ AddToEnumList(_ILCreateMyDocuments());
- while (ret)
+ DWORD dwFetched;
+ while((S_OK == pRegEnumerator->Next(1, &pidl, &dwFetched)) && dwFetched)
{
- DWORD size;
- LONG r;
-
- size = sizeof (iid) / sizeof (iid[0]);
- r = RegEnumKeyExW(hkey, i, iid, &size, 0, NULL, NULL, NULL);
- if (ERROR_SUCCESS == r)
+ if (IsNamespaceExtensionHidden(pidl) < 1)
{
- if (IsNamespaceExtensionHidden(iid) < 1)
- {
- pidl = _ILCreateGuidFromStrW(iid);
- if (pidl != NULL)
- {
- if (!HasItemWithCLSID(pidl))
- {
- ret = AddToEnumList(pidl);
- }
- else
- {
- SHFree(pidl);
- }
- }
- }
+ if (!HasItemWithCLSID(pidl))
+ AddToEnumList(pidl);
+ else
+ SHFree(pidl);
}
- else if (ERROR_NO_MORE_ITEMS == r)
- break;
- else
- ret = FALSE;
- i++;
}
- RegCloseKey(hkey);
}
- }
- for (i = 0; i < 2; i++)
- {
- if (i == 0)
- dwResult = RegOpenKeyExW(HKEY_LOCAL_MACHINE, ClassicStartMenuW, 0, KEY_READ, &hkey);
- else
- dwResult = RegOpenKeyExW(HKEY_CURRENT_USER, ClassicStartMenuW, 0, KEY_READ, &hkey);
- if (dwResult == ERROR_SUCCESS)
- {
- DWORD j = 0, dwVal, Val, dwType, dwIID;
- LONG r;
- WCHAR iid[50];
+ /* Enumerate the items in the two fs folders */
+ AppendItemsFromEnumerator(pDesktopEnumerator);
+ AppendItemsFromEnumerator(pCommonDesktopEnumerator);
- while(ret)
- {
- dwVal = sizeof(Val);
- dwIID = sizeof(iid) / sizeof(WCHAR);
+ return ret ? S_OK : E_FAIL;
+ }
- r = RegEnumValueW(hkey, j++, iid, &dwIID, NULL, &dwType, (LPBYTE)&Val, &dwVal);
- if (r == ERROR_SUCCESS)
- {
- if (Val == 0 && dwType == REG_DWORD)
- {
- LPITEMIDLIST pidl = _ILCreateGuidFromStrW(iid);
- if (pidl != NULL)
- {
- if (!HasItemWithCLSID(pidl))
- {
- AddToEnumList(pidl);
- }
- else
- {
- SHFree(pidl);
- }
- }
- }
- }
- else if (ERROR_NO_MORE_ITEMS == r)
- break;
- else
- ret = FALSE;
- }
- RegCloseKey(hkey);
- }
- }
- }
+ BEGIN_COM_MAP(CDesktopFolderEnum)
+ COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList)
+ END_COM_MAP()
+};
- /* enumerate the elements in %windir%\desktop */
- ret = ret && SHGetSpecialFolderPathW(0, szPath, CSIDL_DESKTOPDIRECTORY, FALSE);
- ret = ret && CreateFolderEnumList(szPath, dwFlags);
+int SHELL_ConfirmMsgBox(HWND hWnd, LPWSTR lpszText, LPWSTR lpszCaption, HICON hIcon, BOOL bYesToAll);
- ret = ret && SHGetSpecialFolderPathW(0, szPath, CSIDL_COMMON_DESKTOPDIRECTORY, FALSE);
- ret = ret && CreateFolderEnumList(szPath, dwFlags);
+static const shvheader DesktopSFHeader[] = {
+ {IDS_SHV_COLUMN_NAME, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15},
+ {IDS_SHV_COLUMN_COMMENTS, SHCOLSTATE_TYPE_STR, LVCFMT_LEFT, 10},
+ {IDS_SHV_COLUMN_TYPE, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 10},
+ {IDS_SHV_COLUMN_SIZE, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10},
+ {IDS_SHV_COLUMN_MODIFIED, SHCOLSTATE_TYPE_DATE | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 12},
+ {IDS_SHV_COLUMN_ATTRIBUTES, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 10}
+};
- return ret ? S_OK : E_FAIL;
-}
+#define DESKTOPSHELLVIEWCOLUMNS 6
+
+static const DWORD dwDesktopAttributes =
+ SFGAO_HASSUBFOLDER | SFGAO_FILESYSTEM | SFGAO_FOLDER | SFGAO_FILESYSANCESTOR |
+ SFGAO_STORAGEANCESTOR | SFGAO_HASPROPSHEET | SFGAO_STORAGE | SFGAO_CANLINK;
+static const DWORD dwMyComputerAttributes =
+ SFGAO_CANRENAME | SFGAO_CANDELETE | SFGAO_HASPROPSHEET | SFGAO_DROPTARGET |
+ SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_HASSUBFOLDER | SFGAO_CANLINK;
+static DWORD dwMyNetPlacesAttributes =
+ SFGAO_CANRENAME | SFGAO_CANDELETE | SFGAO_HASPROPSHEET | SFGAO_DROPTARGET |
+ SFGAO_FILESYSANCESTOR | SFGAO_FOLDER | SFGAO_HASSUBFOLDER | SFGAO_CANLINK;
CDesktopFolder::CDesktopFolder() :
sPathTarget(NULL),
/* Create the inner fs folder */
hr = SHELL32_CoCreateInitSF(pidlRoot,
- NULL,
- NULL,
&CLSID_ShellFSFolder,
CSIDL_DESKTOPDIRECTORY,
IID_PPV_ARG(IShellFolder2, &m_DesktopFSFolder));
/* Create the inner shared fs folder. Dont fail on failure. */
hr = SHELL32_CoCreateInitSF(pidlRoot,
- NULL,
- NULL,
&CLSID_ShellFSFolder,
CSIDL_COMMON_DESKTOPDIRECTORY,
IID_PPV_ARG(IShellFolder2, &m_SharedDesktopFSFolder));
hr = CRegFolder_CreateInstance(&CLSID_ShellDesktop,
pidlRoot,
L"",
+ L"Desktop",
IID_PPV_ARG(IShellFolder2, &m_regFolder));
if (FAILED_UNEXPECTEDLY(hr))
return hr;
*/
HRESULT WINAPI CDesktopFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
{
- return ShellObjectCreatorInit<CDesktopFolderEnum>(this, hwndOwner, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
+ CComPtr<IEnumIDList> pRegEnumerator;
+ CComPtr<IEnumIDList> pDesktopEnumerator;
+ CComPtr<IEnumIDList> pCommonDesktopEnumerator;
+ HRESULT hr;
+
+ hr = m_regFolder->EnumObjects(hwndOwner, dwFlags, &pRegEnumerator);
+ if (FAILED(hr))
+ ERR("EnumObjects for reg folder failed\n");
+
+ hr = m_DesktopFSFolder->EnumObjects(hwndOwner, dwFlags, &pDesktopEnumerator);
+ if (FAILED(hr))
+ ERR("EnumObjects for desktop fs folder failed\n");
+
+ hr = m_SharedDesktopFSFolder->EnumObjects(hwndOwner, dwFlags, &pCommonDesktopEnumerator);
+ if (FAILED(hr))
+ ERR("EnumObjects for shared desktop fs folder failed\n");
+
+ return ShellObjectCreatorInit<CDesktopFolderEnum>(dwFlags,pRegEnumerator, pDesktopEnumerator, pCommonDesktopEnumerator, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
}
/**************************************************************************