/* 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_COLUMN1, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 15},
- {IDS_SHV_COLUMN2, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_RIGHT, 10},
- {IDS_SHV_COLUMN3, SHCOLSTATE_TYPE_STR | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 10},
- {IDS_SHV_COLUMN4, SHCOLSTATE_TYPE_DATE | SHCOLSTATE_ONBYDEFAULT, LVCFMT_LEFT, 12},
-};
-
-#define DESKTOPSHELLVIEWCOLUMNS 4
-
-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)
- {
- ret = AddToEnumList(_ILCreateMyDocuments());
- }
- ret = AddToEnumList(_ILCreateMyComputer());
+class CDesktopFolderEnum :
+ public CEnumIDListBase
+{
+ private:
+// CComPtr fDesktopEnumerator;
+// CComPtr fCommonDesktopEnumerator;
+ public:
- for (i = 0; i < 2; i++)
+ void AddItemsFromClassicStartMenuKey(HKEY hKeyRoot)
{
- 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);
-
- if (dwResult == ERROR_SUCCESS)
+ DWORD dwResult;
+ HKEY hkey;
+ DWORD j = 0, dwVal, Val, dwType, dwIID;
+ LONG r;
+ WCHAR iid[50];
+ LPITEMIDLIST pidl;
+
+ dwResult = RegOpenKeyExW(hKeyRoot, ClassicStartMenuW, 0, KEY_READ, &hkey);
+ if (dwResult != ERROR_SUCCESS)
+ return;
+
+ while(1)
{
- WCHAR iid[50];
- LPITEMIDLIST pidl;
- int i = 0;
+ dwVal = sizeof(Val);
+ dwIID = sizeof(iid) / sizeof(WCHAR);
- while (ret)
- {
- DWORD size;
- LONG r;
+ r = RegEnumValueW(hkey, j++, iid, &dwIID, NULL, &dwType, (LPBYTE)&Val, &dwVal);
+ if (r != ERROR_SUCCESS)
+ break;
- size = sizeof (iid) / sizeof (iid[0]);
- r = RegEnumKeyExW(hkey, i, iid, &size, 0, NULL, NULL, NULL);
- if (ERROR_SUCCESS == r)
+ if (Val == 0 && dwType == REG_DWORD)
+ {
+ pidl = _ILCreateGuidFromStrW(iid);
+ if (pidl != NULL)
{
- 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);
}
+ RegCloseKey(hkey);
}
- for (i = 0; i < 2; i++)
+
+ HRESULT WINAPI Initialize(DWORD dwFlags,IEnumIDList * pRegEnumerator, IEnumIDList *pDesktopEnumerator, IEnumIDList *pCommonDesktopEnumerator)
{
- if (i == 0)
- dwResult = RegOpenKeyExW(HKEY_LOCAL_MACHINE, ClassicStartMenuW, 0, KEY_READ, &hkey);
- else
- dwResult = RegOpenKeyExW(HKEY_CURRENT_USER, ClassicStartMenuW, 0, KEY_READ, &hkey);
+ BOOL ret = TRUE;
+ LPITEMIDLIST pidl;
+
+ 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)
{
- DWORD j = 0, dwVal, Val, dwType, dwIID;
- LONG r;
- WCHAR iid[50];
+ AddToEnumList(_ILCreateMyComputer());
+ if (IsNamespaceExtensionHidden(MyDocumentsClassString) < 1)
+ AddToEnumList(_ILCreateMyDocuments());
- while(ret)
+ DWORD dwFetched;
+ while((S_OK == pRegEnumerator->Next(1, &pidl, &dwFetched)) && dwFetched)
{
- dwVal = sizeof(Val);
- dwIID = sizeof(iid) / sizeof(WCHAR);
-
- r = RegEnumValueW(hkey, j++, iid, &dwIID, NULL, &dwType, (LPBYTE)&Val, &dwVal);
- if (r == ERROR_SUCCESS)
+ if (IsNamespaceExtensionHidden(pidl) < 1)
{
- if (Val == 0 && dwType == REG_DWORD)
- {
- LPITEMIDLIST pidl = _ILCreateGuidFromStrW(iid);
- if (pidl != NULL)
- {
- if (!HasItemWithCLSID(pidl))
- {
- AddToEnumList(pidl);
- }
- else
- {
- SHFree(pidl);
- }
- }
- }
+ if (!HasItemWithCLSID(pidl))
+ AddToEnumList(pidl);
+ else
+ SHFree(pidl);
}
- else if (ERROR_NO_MORE_ITEMS == r)
- break;
- else
- ret = FALSE;
}
- RegCloseKey(hkey);
+ AddItemsFromClassicStartMenuKey(HKEY_LOCAL_MACHINE);
+ AddItemsFromClassicStartMenuKey(HKEY_CURRENT_USER);
}
+ /* Enumerate the items in the two fs folders */
+ AppendItemsFromEnumerator(pDesktopEnumerator);
+ AppendItemsFromEnumerator(pCommonDesktopEnumerator);
+
+ return ret ? S_OK : E_FAIL;
}
- }
- /* enumerate the elements in %windir%\desktop */
- ret = ret && SHGetSpecialFolderPathW(0, szPath, CSIDL_DESKTOPDIRECTORY, FALSE);
- ret = ret && CreateFolderEnumList(szPath, dwFlags);
- ret = ret && SHGetSpecialFolderPathW(0, szPath, CSIDL_COMMON_DESKTOPDIRECTORY, FALSE);
- ret = ret && CreateFolderEnumList(szPath, dwFlags);
+ BEGIN_COM_MAP(CDesktopFolderEnum)
+ COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList)
+ END_COM_MAP()
+};
- return ret ? S_OK : E_FAIL;
-}
+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;
CDesktopFolder::CDesktopFolder() :
sPathTarget(NULL),
HRESULT WINAPI CDesktopFolder::FinalConstruct()
{
- WCHAR szMyPath[MAX_PATH]; HRESULT hr;
+ WCHAR szMyPath[MAX_PATH];
+ HRESULT hr;
/* Create the root pidl */
pidlRoot = _ILCreateDesktop();
/* 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));
if (FAILED_UNEXPECTEDLY(hr))
return hr;
+ /* Create the inner reg folder */
+ hr = CRegFolder_CreateInstance(&CLSID_ShellDesktop,
+ pidlRoot,
+ L"",
+ L"Desktop",
+ IID_PPV_ARG(IShellFolder2, &m_regFolder));
+ if (FAILED_UNEXPECTEDLY(hr))
+ return hr;
/* Cache the path to the user desktop directory */
if (!SHGetSpecialFolderPathW( 0, szMyPath, CSIDL_DESKTOPDIRECTORY, TRUE ))
{
WCHAR szFileName[MAX_PATH];
+ if (_ILIsSpecialFolder(pidl))
+ return m_regFolder->QueryInterface(IID_PPV_ARG(IShellFolder2, psf));
+
lstrcpynW(szFileName, sPathTarget, MAX_PATH - 1);
PathAddBackslashW(szFileName);
int cLen = wcslen(szFileName);
if (lpszDisplayName[0] == ':' && lpszDisplayName[1] == ':')
{
- return SH_ParseGuidDisplayName(this, hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl, pdwAttributes);
+ return m_regFolder->ParseDisplayName(hwndOwner, pbc, lpszDisplayName, pchEaten, ppidl, pdwAttributes);
}
else if (PathGetDriveNumberW (lpszDisplayName) >= 0)
{
*/
HRESULT WINAPI CDesktopFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
{
- return ShellObjectCreatorInit<CDesktopFolderEnum>(this, hwndOwner, dwFlags, IID_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));
}
/**************************************************************************
if (!pidl)
return E_INVALIDARG;
- if (_ILIsSpecialFolder(pidl))
- return SHELL32_BindToGuidItem(pidlRoot, pidl, pbcReserved, riid, ppvOut);
-
CComPtr<IShellFolder2> psf;
HRESULT hr = _GetSFFromPidl(pidl, &psf);
if (FAILED_UNEXPECTEDLY(hr))
return MAKE_COMPARE_HRESULT(bIsDesktopFolder1 - bIsDesktopFolder2);
if (_ILIsSpecialFolder(pidl1) || _ILIsSpecialFolder(pidl2))
- return SHELL32_CompareGuidItems(this, lParam, pidl1, pidl2);
+ return m_regFolder->CompareIDs(lParam, pidl1, pidl2);
return m_DesktopFSFolder->CompareIDs(lParam, pidl1, pidl2);
}
REFIID riid,
LPVOID *ppvOut)
{
- CComPtr<IShellView> pShellView;
HRESULT hr = E_INVALIDARG;
TRACE ("(%p)->(hwnd=%p,%s,%p)\n",
}
else if (IsEqualIID (riid, IID_IContextMenu))
{
- WARN ("IContextMenu not implemented\n");
- hr = E_NOTIMPL;
+ HKEY hKeys[16];
+ UINT cKeys = 0;
+ AddClassKeyToArray(L"Directory\\Background", hKeys, &cKeys);
+
+ DEFCONTEXTMENU dcm;
+ dcm.hwnd = hwndOwner;
+ dcm.pcmcb = this;
+ dcm.pidlFolder = pidlRoot;
+ dcm.psf = this;
+ dcm.cidl = 0;
+ dcm.apidl = NULL;
+ dcm.cKeys = cKeys;
+ dcm.aKeys = hKeys;
+ dcm.punkAssociationInfo = NULL;
+ hr = SHCreateDefaultContextMenu (&dcm, riid, ppvOut);
}
else if (IsEqualIID (riid, IID_IShellView))
{
- hr = IShellView_Constructor((IShellFolder *)this, &pShellView);
- if (pShellView)
- hr = pShellView->QueryInterface(riid, ppvOut);
+ SFV_CREATE sfvparams = {sizeof(SFV_CREATE), this};
+ hr = SHCreateShellFolderView(&sfvparams, (IShellView**)ppvOut);
}
TRACE ("-- (%p)->(interface=%p)\n", this, ppvOut);
return hr;
*rgfInOut &= dwMyComputerAttributes;
else if (_ILIsNetHood(apidl[i]))
*rgfInOut &= dwMyNetPlacesAttributes;
- else if (_ILIsSpecialFolder(apidl[i]))
- SHELL32_GetGuidItemAttributes(this, apidl[i], rgfInOut);
- else if (_ILIsFolder(apidl[i]) || _ILIsValue(apidl[i]))
+ else if (_ILIsFolder(apidl[i]) || _ILIsValue(apidl[i]) || _ILIsSpecialFolder(apidl[i]))
{
CComPtr<IShellFolder2> psf;
HRESULT hr = _GetSFFromPidl(apidl[i], &psf);
if (IsEqualIID (riid, IID_IContextMenu))
{
- hr = CDefFolderMenu_Create2(pidlRoot, hwndOwner, cidl, apidl, (IShellFolder *)this, NULL, 0, NULL, (IContextMenu **)&pObj);
+ if (_ILIsSpecialFolder(apidl[0]))
+ {
+ hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
+ }
+ else
+ {
+ /* Do not use the context menu of the CFSFolder here. */
+ /* We need to pass a pointer of the CDesktopFolder so as the data object that the context menu gets is rooted to the desktop */
+ /* Otherwise operations like that involve items from both user and shared desktop will not work */
+ HKEY hKeys[16];
+ UINT cKeys = 0;
+ AddFSClassKeysToArray(apidl[0], hKeys, &cKeys);
+
+ DEFCONTEXTMENU dcm;
+ dcm.hwnd = hwndOwner;
+ dcm.pcmcb = this;
+ dcm.pidlFolder = pidlRoot;
+ dcm.psf = this;
+ dcm.cidl = cidl;
+ dcm.apidl = apidl;
+ dcm.cKeys = cKeys;
+ dcm.aKeys = hKeys;
+ dcm.punkAssociationInfo = NULL;
+ hr = SHCreateDefaultContextMenu (&dcm, riid, &pObj);
+ }
}
else if (IsEqualIID (riid, IID_IDataObject) && (cidl >= 1))
{
}
else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
{
- hr = CGuidItemExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
+ hr = m_regFolder->GetUIObjectOf(hwndOwner, cidl, apidl, riid, prgfInOut, &pObj);
+ }
+ else if (IsEqualIID (riid, IID_IDropTarget) && (cidl == 1))
+ {
+ CComPtr<IShellFolder> psfChild;
+ hr = this->BindToObject(apidl[0], NULL, IID_PPV_ARG(IShellFolder, &psfChild));
+ if (FAILED_UNEXPECTEDLY(hr))
+ return hr;
+
+ return psfChild->CreateViewObject(NULL, riid, ppvOut);
}
else
hr = E_NOINTERFACE;
{
return SHELL32_GetDisplayNameOfChild(this, pidl, dwFlags, strRet);
}
- else if (!_ILIsDesktop(pidl) && _ILIsSpecialFolder(pidl))
- {
- return SHELL32_GetDisplayNameOfGUIDItem(this, L"", pidl, dwFlags, strRet);
- }
else if (_ILIsDesktop(pidl))
{
if ((GET_SHGDN_RELATION(dwFlags) == SHGDN_NORMAL) && (GET_SHGDN_FOR(dwFlags) & SHGDN_FORPARSING))
return SHSetStrRet(strRet, sPathTarget);
else
- return HCR_GetClassName(CLSID_ShellDesktop, strRet);
+ return m_regFolder->GetDisplayNameOf(pidl, dwFlags, strRet);
}
/* file system folder or file rooted at the desktop */
DWORD dwFlags,
PITEMID_CHILD *pPidlOut)
{
- if (_ILGetGUIDPointer(pidl))
- return SHELL32_SetNameOfGuidItem(pidl, lpName, dwFlags, pPidlOut);
-
CComPtr<IShellFolder2> psf;
HRESULT hr = _GetSFFromPidl(pidl, &psf);
if (FAILED_UNEXPECTEDLY(hr))
psd->cxChar = DesktopSFHeader[iColumn].cxChar;
return SHSetStrRet(&psd->str, DesktopSFHeader[iColumn].colnameid);
}
- else if (_ILIsSpecialFolder(pidl))
- {
- return SHELL32_GetDetailsOfGuidItem(this, pidl, iColumn, psd);
- }
CComPtr<IShellFolder2> psf;
HRESULT hr = _GetSFFromPidl(pidl, &psf);
{
TRACE ("(%p)->(%p)\n", this, pidl);
- return E_NOTIMPL;
+ return E_INVALIDARG;
}
HRESULT WINAPI CDesktopFolder::GetCurFolder(LPITEMIDLIST * pidl)
{
TRACE ("(%p)->(%p)\n", this, pidl);
- if (!pidl) return E_POINTER;
+ if (!pidl)
+ return E_INVALIDARG; /* xp doesn't have this check and crashes on NULL */
*pidl = ILClone (pidlRoot);
return S_OK;
}
+HRESULT WINAPI CDesktopFolder::CallBack(IShellFolder *psf, HWND hwndOwner, IDataObject *pdtobj, UINT uMsg, WPARAM wParam, LPARAM lParam)
+{
+ if (uMsg != DFM_MERGECONTEXTMENU && uMsg != DFM_INVOKECOMMAND)
+ return S_OK;
+
+ /* no data object means no selection */
+ if (!pdtobj)
+ {
+ if (uMsg == DFM_INVOKECOMMAND && wParam == DFM_CMD_PROPERTIES)
+ {
+ if (32 >= (UINT)ShellExecuteW(hwndOwner, L"open", L"rundll32.exe shell32.dll,Control_RunDLL desk.cpl", NULL, NULL, SW_SHOWNORMAL))
+ return E_FAIL;
+ return S_OK;
+ }
+ else if (uMsg == DFM_MERGECONTEXTMENU)
+ {
+ QCMINFO *pqcminfo = (QCMINFO *)lParam;
+ _InsertMenuItemW(pqcminfo->hmenu, pqcminfo->indexMenu++, TRUE, 0, MFT_SEPARATOR, NULL, 0);
+ _InsertMenuItemW(pqcminfo->hmenu, pqcminfo->indexMenu++, TRUE, FCIDM_SHVIEW_PROPERTIES, MFT_STRING, MAKEINTRESOURCEW(IDS_PROPERTIES), MFS_ENABLED);
+ }
+
+ return S_OK;
+ }
+
+ PIDLIST_ABSOLUTE pidlFolder;
+ PUITEMID_CHILD *apidl;
+ UINT cidl;
+ HRESULT hr = SH_GetApidlFromDataObject(pdtobj, &pidlFolder, &apidl, &cidl);
+ if (FAILED_UNEXPECTEDLY(hr))
+ return hr;
+
+ if (cidl > 1)
+ ERR("SHMultiFileProperties is not yet implemented\n");
+
+ STRRET strFile;
+ hr = GetDisplayNameOf(apidl[0], SHGDN_FORPARSING, &strFile);
+ if (SUCCEEDED(hr))
+ {
+ hr = SH_ShowPropertiesDialog(strFile.pOleStr, pidlFolder, apidl);
+ if (FAILED(hr))
+ ERR("SH_ShowPropertiesDialog failed\n");
+ }
+ else
+ {
+ ERR("Failed to get display name\n");
+ }
+
+ SHFree(pidlFolder);
+ _ILFreeaPidl(apidl, cidl);
+
+ return hr;
+}
+
/*************************************************************************
* SHGetDesktopFolder [SHELL32.@]
*/