public CEnumIDListBase
{
public:
- CDrivesFolderEnum();
- ~CDrivesFolderEnum();
- HRESULT WINAPI Initialize(HWND hwndOwner, DWORD dwFlags);
- BOOL CreateMyCompEnumList(DWORD dwFlags);
+ HRESULT WINAPI Initialize(HWND hwndOwner, DWORD dwFlags, IEnumIDList* pRegEnumerator)
+ {
+ /* enumerate the folders */
+ if (dwFlags & SHCONTF_FOLDERS)
+ {
+ WCHAR wszDriveName[] = {'A', ':', '\\', '\0'};
+ DWORD dwDrivemap = GetLogicalDrives();
+
+ while (wszDriveName[0] <= 'Z')
+ {
+ if(dwDrivemap & 0x00000001L)
+ AddToEnumList(_ILCreateDrive(wszDriveName));
+ wszDriveName[0]++;
+ dwDrivemap = dwDrivemap >> 1;
+ }
+ }
+
+ /* Enumerate the items of the reg folder */
+ AppendItemsFromEnumerator(pRegEnumerator);
+
+ return S_OK;
+ }
BEGIN_COM_MAP(CDrivesFolderEnum)
COM_INTERFACE_ENTRY_IID(IID_IEnumIDList, IEnumIDList)
SFGAO_HASSUBFOLDER | SFGAO_FILESYSTEM | SFGAO_FOLDER | SFGAO_FILESYSANCESTOR |
SFGAO_DROPTARGET | SFGAO_HASPROPSHEET | SFGAO_CANRENAME | SFGAO_CANLINK;
-CDrivesFolderEnum::CDrivesFolderEnum()
-{
-}
-
-CDrivesFolderEnum::~CDrivesFolderEnum()
-{
-}
-
-HRESULT WINAPI CDrivesFolderEnum::Initialize(HWND hwndOwner, DWORD dwFlags)
-{
- if (CreateMyCompEnumList(dwFlags) == FALSE)
- return E_FAIL;
-
- return S_OK;
-}
-
-/**************************************************************************
- * CDrivesFolderEnum::CreateMyCompEnumList()
- */
-
-BOOL CDrivesFolderEnum::CreateMyCompEnumList(DWORD dwFlags)
-{
- BOOL bRet = TRUE;
- static const WCHAR MyComputer_NameSpaceW[] = L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\MyComputer\\Namespace";
-
- TRACE("(%p)->(flags=0x%08x)\n", this, dwFlags);
-
- /* enumerate the folders */
- if (dwFlags & SHCONTF_FOLDERS)
- {
- WCHAR wszDriveName[] = {'A', ':', '\\', '\0'};
- DWORD dwDrivemap = GetLogicalDrives();
- HKEY hKey;
- UINT i;
-
- while (bRet && wszDriveName[0] <= 'Z')
- {
- if(dwDrivemap & 0x00000001L)
- bRet = AddToEnumList(_ILCreateDrive(wszDriveName));
- wszDriveName[0]++;
- dwDrivemap = dwDrivemap >> 1;
- }
-
- TRACE("-- (%p)-> enumerate (mycomputer shell extensions)\n", this);
- for (i = 0; i < 2; i++)
- {
- if (bRet && ERROR_SUCCESS == RegOpenKeyExW(i == 0 ? HKEY_LOCAL_MACHINE : HKEY_CURRENT_USER,
- MyComputer_NameSpaceW, 0, KEY_READ, &hKey))
- {
- WCHAR wszBuf[50];
- DWORD dwSize, j = 0;
- LONG ErrorCode;
- LPITEMIDLIST pidl;
-
- while (bRet)
- {
- dwSize = sizeof(wszBuf) / sizeof(wszBuf[0]);
- ErrorCode = RegEnumKeyExW(hKey, j, wszBuf, &dwSize, 0, NULL, NULL, NULL);
- if (ERROR_SUCCESS == ErrorCode)
- {
- if (wszBuf[0] != L'{')
- {
- dwSize = sizeof(wszBuf);
- RegGetValueW(hKey, wszBuf, NULL, RRF_RT_REG_SZ, NULL, wszBuf, &dwSize);
- }
-
- /* FIXME: shell extensions - the type should be PT_SHELLEXT (tested) */
- pidl = _ILCreateGuidFromStrW(wszBuf);
- if (pidl != NULL)
- bRet = AddToEnumList(pidl);
- else
- ERR("Invalid MyComputer namespace extesion: %s\n", wszBuf);
- j++;
- }
- else if (ERROR_NO_MORE_ITEMS == ErrorCode)
- break;
- else
- bRet = FALSE;
- }
- RegCloseKey(hKey);
- }
- }
- }
- return bRet;
-}
-
CDrivesFolder::CDrivesFolder()
{
pidlRoot = NULL;
HRESULT hr = CRegFolder_CreateInstance(&CLSID_MyComputer,
pidlRoot,
L"::{20D04FE0-3AEA-1069-A2D8-08002B30309D}",
+ L"MyComputer",
IID_PPV_ARG(IShellFolder2, &m_regFolder));
return hr;
*/
HRESULT WINAPI CDrivesFolder::EnumObjects(HWND hwndOwner, DWORD dwFlags, LPENUMIDLIST *ppEnumIDList)
{
- return ShellObjectCreatorInit<CDrivesFolderEnum>(hwndOwner, dwFlags, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
+ CComPtr<IEnumIDList> pRegEnumerator;
+ m_regFolder->EnumObjects(hwndOwner, dwFlags, &pRegEnumerator);
+
+ return ShellObjectCreatorInit<CDrivesFolderEnum>(hwndOwner, dwFlags, pRegEnumerator, IID_PPV_ARG(IEnumIDList, ppEnumIDList));
}
/**************************************************************************
if (_ILIsSpecialFolder(pidl))
return m_regFolder->BindToObject(pidl, pbcReserved, riid, ppvOut);
- LPITEMIDLIST pidlChild = ILCloneFirst (pidl);
- if (!pidlChild)
- return E_OUTOFMEMORY;
-
- CComPtr<IShellFolder> psf;
- HRESULT hr = SHELL32_CoCreateInitSF(pidlRoot,
- NULL,
- pidlChild,
- &CLSID_ShellFSFolder,
- -1,
- IID_PPV_ARG(IShellFolder, &psf));
-
- ILFree(pidlChild);
-
- if (FAILED(hr))
+ CHAR* pchDrive = _ILGetDataPointer(pidl)->u.drive.szDriveName;
+
+ PERSIST_FOLDER_TARGET_INFO pfti = {0};
+ pfti.dwAttributes = -1;
+ pfti.csidl = -1;
+ pfti.szTargetParsingName[0] = *pchDrive;
+ pfti.szTargetParsingName[1] = L':';
+ pfti.szTargetParsingName[2] = L'\\';
+
+ HRESULT hr = SHELL32_BindToSF(pidlRoot,
+ &pfti,
+ pidl,
+ &CLSID_ShellFSFolder,
+ riid,
+ ppvOut);
+ if (FAILED_UNEXPECTEDLY(hr))
return hr;
- if (_ILIsPidlSimple (pidl))
- {
- return psf->QueryInterface(riid, ppvOut);
- }
- else
- {
- return psf->BindToObject(ILGetNext (pidl), pbcReserved, riid, ppvOut);
- }
+ return S_OK;
}
/**************************************************************************