mirror of
https://github.com/reactos/reactos.git
synced 2025-08-04 16:26:02 +00:00
[SHELLL32]
- Split GenericExtractIcon_CreateInstance into CGuidItemExtractIcon_CreateInstance, CFSExtractIcon_CreateInstance and CDrivesExtractIcon_CreateInstance. svn path=/trunk/; revision=72041
This commit is contained in:
parent
4bbb7474b4
commit
45aa3e9f88
6 changed files with 131 additions and 102 deletions
|
@ -192,126 +192,102 @@ GetIconOverlay(LPCITEMIDLIST pidl, WCHAR * wTemp, int* pIndex)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT GenericExtractIcon_CreateInstance(IShellFolder * psf, LPCITEMIDLIST pidl, REFIID iid, LPVOID * ppvOut)
|
HRESULT CGuidItemExtractIcon_CreateInstance(IShellFolder * psf, LPCITEMIDLIST pidl, REFIID iid, LPVOID * ppvOut)
|
||||||
{
|
{
|
||||||
CComPtr<IDefaultExtractIconInit> initIcon;
|
CComPtr<IDefaultExtractIconInit> initIcon;
|
||||||
|
HRESULT hr;
|
||||||
GUID const * riid;
|
GUID const * riid;
|
||||||
int icon_idx;
|
int icon_idx;
|
||||||
UINT flags;
|
|
||||||
CHAR sTemp[MAX_PATH];
|
|
||||||
WCHAR wTemp[MAX_PATH];
|
WCHAR wTemp[MAX_PATH];
|
||||||
LPCITEMIDLIST pSimplePidl = pidl;
|
|
||||||
HRESULT hr;
|
|
||||||
|
|
||||||
hr = SHCreateDefaultExtractIcon(IID_PPV_ARG(IDefaultExtractIconInit,&initIcon));
|
hr = SHCreateDefaultExtractIcon(IID_PPV_ARG(IDefaultExtractIconInit,&initIcon));
|
||||||
if (FAILED(hr))
|
if (FAILED(hr))
|
||||||
return hr;
|
return hr;
|
||||||
|
|
||||||
if (_ILIsDesktop(pSimplePidl))
|
if (_ILIsDesktop(pidl))
|
||||||
{
|
{
|
||||||
initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_DESKTOP);
|
initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_DESKTOP);
|
||||||
|
return initIcon->QueryInterface(iid, ppvOut);
|
||||||
}
|
}
|
||||||
else if ((riid = _ILGetGUIDPointer(pSimplePidl)))
|
|
||||||
|
riid = _ILGetGUIDPointer(pidl);
|
||||||
|
if (!riid)
|
||||||
|
return E_FAIL;
|
||||||
|
|
||||||
|
/* my computer and other shell extensions */
|
||||||
|
static const WCHAR fmt[] = { 'C', 'L', 'S', 'I', 'D', '\\',
|
||||||
|
'{', '%', '0', '8', 'l', 'x', '-', '%', '0', '4', 'x', '-', '%', '0', '4', 'x', '-',
|
||||||
|
'%', '0', '2', 'x', '%', '0', '2', 'x', '-', '%', '0', '2', 'x', '%', '0', '2', 'x',
|
||||||
|
'%', '0', '2', 'x', '%', '0', '2', 'x', '%', '0', '2', 'x', '%', '0', '2', 'x', '}', 0
|
||||||
|
};
|
||||||
|
WCHAR xriid[50];
|
||||||
|
|
||||||
|
swprintf(xriid, fmt,
|
||||||
|
riid->Data1, riid->Data2, riid->Data3,
|
||||||
|
riid->Data4[0], riid->Data4[1], riid->Data4[2], riid->Data4[3],
|
||||||
|
riid->Data4[4], riid->Data4[5], riid->Data4[6], riid->Data4[7]);
|
||||||
|
|
||||||
|
const WCHAR* iconname = NULL;
|
||||||
|
if (_ILIsBitBucket(pidl))
|
||||||
{
|
{
|
||||||
/* my computer and other shell extensions */
|
static const WCHAR szFull[] = {'F','u','l','l',0};
|
||||||
static const WCHAR fmt[] = { 'C', 'L', 'S', 'I', 'D', '\\',
|
static const WCHAR szEmpty[] = {'E','m','p','t','y',0};
|
||||||
'{', '%', '0', '8', 'l', 'x', '-', '%', '0', '4', 'x', '-', '%', '0', '4', 'x', '-',
|
CComPtr<IEnumIDList> EnumIDList;
|
||||||
'%', '0', '2', 'x', '%', '0', '2', 'x', '-', '%', '0', '2', 'x', '%', '0', '2', 'x',
|
CoInitialize(NULL);
|
||||||
'%', '0', '2', 'x', '%', '0', '2', 'x', '%', '0', '2', 'x', '%', '0', '2', 'x', '}', 0
|
|
||||||
};
|
|
||||||
WCHAR xriid[50];
|
|
||||||
|
|
||||||
swprintf(xriid, fmt,
|
CComPtr<IShellFolder2> psfRecycleBin;
|
||||||
riid->Data1, riid->Data2, riid->Data3,
|
CComPtr<IShellFolder> psfDesktop;
|
||||||
riid->Data4[0], riid->Data4[1], riid->Data4[2], riid->Data4[3],
|
hr = SHGetDesktopFolder(&psfDesktop);
|
||||||
riid->Data4[4], riid->Data4[5], riid->Data4[6], riid->Data4[7]);
|
|
||||||
|
|
||||||
const WCHAR* iconname = NULL;
|
if (SUCCEEDED(hr))
|
||||||
if (_ILIsBitBucket(pSimplePidl))
|
hr = psfDesktop->BindToObject(pidl, NULL, IID_PPV_ARG(IShellFolder2, &psfRecycleBin));
|
||||||
|
if (SUCCEEDED(hr))
|
||||||
|
hr = psfRecycleBin->EnumObjects(NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &EnumIDList);
|
||||||
|
|
||||||
|
ULONG itemcount;
|
||||||
|
LPITEMIDLIST pidl = NULL;
|
||||||
|
if (SUCCEEDED(hr) && (hr = EnumIDList->Next(1, &pidl, &itemcount)) == S_OK)
|
||||||
{
|
{
|
||||||
static const WCHAR szFull[] = {'F','u','l','l',0};
|
CoTaskMemFree(pidl);
|
||||||
static const WCHAR szEmpty[] = {'E','m','p','t','y',0};
|
iconname = szFull;
|
||||||
CComPtr<IEnumIDList> EnumIDList;
|
} else {
|
||||||
CoInitialize(NULL);
|
iconname = szEmpty;
|
||||||
|
|
||||||
CComPtr<IShellFolder2> psfRecycleBin;
|
|
||||||
CComPtr<IShellFolder> psfDesktop;
|
|
||||||
hr = SHGetDesktopFolder(&psfDesktop);
|
|
||||||
|
|
||||||
if (SUCCEEDED(hr))
|
|
||||||
hr = psfDesktop->BindToObject(pSimplePidl, NULL, IID_PPV_ARG(IShellFolder2, &psfRecycleBin));
|
|
||||||
if (SUCCEEDED(hr))
|
|
||||||
hr = psfRecycleBin->EnumObjects(NULL, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS, &EnumIDList);
|
|
||||||
|
|
||||||
ULONG itemcount;
|
|
||||||
LPITEMIDLIST pidl = NULL;
|
|
||||||
if (SUCCEEDED(hr) && (hr = EnumIDList->Next(1, &pidl, &itemcount)) == S_OK)
|
|
||||||
{
|
|
||||||
CoTaskMemFree(pidl);
|
|
||||||
iconname = szFull;
|
|
||||||
} else {
|
|
||||||
iconname = szEmpty;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (HCR_GetIconW(xriid, wTemp, iconname, MAX_PATH, &icon_idx))
|
|
||||||
{
|
|
||||||
initIcon->SetNormalIcon(wTemp, icon_idx);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (IsEqualGUID(*riid, CLSID_MyComputer))
|
|
||||||
initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_MY_COMPUTER);
|
|
||||||
else if (IsEqualGUID(*riid, CLSID_MyDocuments))
|
|
||||||
initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_MY_DOCUMENTS);
|
|
||||||
else if (IsEqualGUID(*riid, CLSID_NetworkPlaces))
|
|
||||||
initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_MY_NETWORK_PLACES);
|
|
||||||
else
|
|
||||||
initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_FOLDER);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (_ILIsDrive (pSimplePidl))
|
if (HCR_GetIconW(xriid, wTemp, iconname, MAX_PATH, &icon_idx))
|
||||||
{
|
{
|
||||||
static const WCHAR drive[] = { 'D', 'r', 'i', 'v', 'e', 0 };
|
initIcon->SetNormalIcon(wTemp, icon_idx);
|
||||||
int icon_idx = -1;
|
}
|
||||||
|
else
|
||||||
if (_ILGetDrive(pSimplePidl, sTemp, MAX_PATH))
|
{
|
||||||
{
|
if (IsEqualGUID(*riid, CLSID_MyComputer))
|
||||||
switch(GetDriveTypeA(sTemp))
|
initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_MY_COMPUTER);
|
||||||
{
|
else if (IsEqualGUID(*riid, CLSID_MyDocuments))
|
||||||
case DRIVE_REMOVABLE:
|
initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_MY_DOCUMENTS);
|
||||||
icon_idx = IDI_SHELL_3_14_FLOPPY;
|
else if (IsEqualGUID(*riid, CLSID_NetworkPlaces))
|
||||||
break;
|
initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_MY_NETWORK_PLACES);
|
||||||
case DRIVE_CDROM:
|
|
||||||
icon_idx = IDI_SHELL_CDROM;
|
|
||||||
break;
|
|
||||||
case DRIVE_REMOTE:
|
|
||||||
icon_idx = IDI_SHELL_NETDRIVE;
|
|
||||||
break;
|
|
||||||
case DRIVE_RAMDISK:
|
|
||||||
icon_idx = IDI_SHELL_RAMDISK;
|
|
||||||
break;
|
|
||||||
case DRIVE_NO_ROOT_DIR:
|
|
||||||
icon_idx = IDI_SHELL_CDROM;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (icon_idx != -1)
|
|
||||||
{
|
|
||||||
initIcon->SetNormalIcon(swShell32Name, -icon_idx);
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
{
|
initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_FOLDER);
|
||||||
if (HCR_GetIconW(drive, wTemp, NULL, MAX_PATH, &icon_idx))
|
|
||||||
initIcon->SetNormalIcon(wTemp, icon_idx);
|
|
||||||
else
|
|
||||||
initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_DRIVE);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (_ILIsFolder (pSimplePidl))
|
return initIcon->QueryInterface(iid, ppvOut);
|
||||||
|
}
|
||||||
|
|
||||||
|
HRESULT CFSExtractIcon_CreateInstance(IShellFolder * psf, LPCITEMIDLIST pidl, REFIID iid, LPVOID * ppvOut)
|
||||||
|
{
|
||||||
|
CComPtr<IDefaultExtractIconInit> initIcon;
|
||||||
|
HRESULT hr;
|
||||||
|
int icon_idx;
|
||||||
|
UINT flags;
|
||||||
|
CHAR sTemp[MAX_PATH];
|
||||||
|
WCHAR wTemp[MAX_PATH];
|
||||||
|
|
||||||
|
hr = SHCreateDefaultExtractIcon(IID_PPV_ARG(IDefaultExtractIconInit,&initIcon));
|
||||||
|
if (FAILED(hr))
|
||||||
|
return hr;
|
||||||
|
|
||||||
|
if (_ILIsFolder (pidl))
|
||||||
{
|
{
|
||||||
if (SUCCEEDED(getIconLocationForFolder(psf,
|
if (SUCCEEDED(getIconLocationForFolder(psf,
|
||||||
pidl, 0, wTemp, MAX_PATH,
|
pidl, 0, wTemp, MAX_PATH,
|
||||||
|
@ -350,7 +326,7 @@ HRESULT GenericExtractIcon_CreateInstance(IShellFolder * psf, LPCITEMIDLIST pidl
|
||||||
{
|
{
|
||||||
BOOL found = FALSE;
|
BOOL found = FALSE;
|
||||||
|
|
||||||
if (_ILGetExtension(pSimplePidl, sTemp, MAX_PATH))
|
if (_ILGetExtension(pidl, sTemp, MAX_PATH))
|
||||||
{
|
{
|
||||||
if (HCR_MapTypeToValueA(sTemp, sTemp, MAX_PATH, TRUE)
|
if (HCR_MapTypeToValueA(sTemp, sTemp, MAX_PATH, TRUE)
|
||||||
&& HCR_GetIconA(sTemp, sTemp, NULL, MAX_PATH, &icon_idx))
|
&& HCR_GetIconA(sTemp, sTemp, NULL, MAX_PATH, &icon_idx))
|
||||||
|
|
|
@ -130,7 +130,7 @@ HRESULT CCPLExtractIcon_CreateInstance(IShellFolder * psf, LPCITEMIDLIST pidl, R
|
||||||
PIDLCPanelStruct *pData = _ILGetCPanelPointer(pidl);
|
PIDLCPanelStruct *pData = _ILGetCPanelPointer(pidl);
|
||||||
if (!pData)
|
if (!pData)
|
||||||
{
|
{
|
||||||
return GenericExtractIcon_CreateInstance(psf, pidl, riid, ppvOut);
|
return CGuidItemExtractIcon_CreateInstance(psf, pidl, riid, ppvOut);
|
||||||
}
|
}
|
||||||
|
|
||||||
CComPtr<IDefaultExtractIconInit> initIcon;
|
CComPtr<IDefaultExtractIconInit> initIcon;
|
||||||
|
|
|
@ -642,7 +642,7 @@ HRESULT WINAPI CDesktopFolder::GetUIObjectOf(
|
||||||
}
|
}
|
||||||
else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
|
else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
|
||||||
{
|
{
|
||||||
hr = GenericExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
|
hr = CGuidItemExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
hr = E_NOINTERFACE;
|
hr = E_NOINTERFACE;
|
||||||
|
|
|
@ -39,6 +39,58 @@ CDrivesFolderEnum is only responsible for returning the physical items.
|
||||||
* IShellFolder implementation
|
* IShellFolder implementation
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
HRESULT CDrivesExtractIcon_CreateInstance(IShellFolder * psf, LPCITEMIDLIST pidl, REFIID riid, LPVOID * ppvOut)
|
||||||
|
{
|
||||||
|
if (!_ILIsDrive(pidl))
|
||||||
|
{
|
||||||
|
return CGuidItemExtractIcon_CreateInstance(psf, pidl, riid, ppvOut);
|
||||||
|
}
|
||||||
|
|
||||||
|
CComPtr<IDefaultExtractIconInit> initIcon;
|
||||||
|
HRESULT hr = SHCreateDefaultExtractIcon(IID_PPV_ARG(IDefaultExtractIconInit, &initIcon));
|
||||||
|
if (FAILED(hr))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
CHAR* pszDrive = _ILGetDataPointer(pidl)->u.drive.szDriveName;
|
||||||
|
WCHAR wTemp[MAX_PATH];
|
||||||
|
int icon_idx = -1;
|
||||||
|
|
||||||
|
if (pszDrive)
|
||||||
|
{
|
||||||
|
switch(GetDriveTypeA(pszDrive))
|
||||||
|
{
|
||||||
|
case DRIVE_REMOVABLE:
|
||||||
|
icon_idx = IDI_SHELL_3_14_FLOPPY;
|
||||||
|
break;
|
||||||
|
case DRIVE_CDROM:
|
||||||
|
icon_idx = IDI_SHELL_CDROM;
|
||||||
|
break;
|
||||||
|
case DRIVE_REMOTE:
|
||||||
|
icon_idx = IDI_SHELL_NETDRIVE;
|
||||||
|
break;
|
||||||
|
case DRIVE_RAMDISK:
|
||||||
|
icon_idx = IDI_SHELL_RAMDISK;
|
||||||
|
break;
|
||||||
|
case DRIVE_NO_ROOT_DIR:
|
||||||
|
icon_idx = IDI_SHELL_CDROM;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (icon_idx != -1)
|
||||||
|
{
|
||||||
|
initIcon->SetNormalIcon(swShell32Name, -icon_idx);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (HCR_GetIconW(L"Drive", wTemp, NULL, MAX_PATH, &icon_idx))
|
||||||
|
initIcon->SetNormalIcon(wTemp, icon_idx);
|
||||||
|
else
|
||||||
|
initIcon->SetNormalIcon(swShell32Name, -IDI_SHELL_DRIVE);
|
||||||
|
}
|
||||||
|
|
||||||
|
return initIcon->QueryInterface(riid, ppvOut);
|
||||||
|
}
|
||||||
class CDrivesFolderEnum :
|
class CDrivesFolderEnum :
|
||||||
public CEnumIDListBase
|
public CEnumIDListBase
|
||||||
{
|
{
|
||||||
|
@ -457,7 +509,7 @@ HRESULT WINAPI CDrivesFolder::GetUIObjectOf(HWND hwndOwner,
|
||||||
}
|
}
|
||||||
else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
|
else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
|
||||||
{
|
{
|
||||||
hr = GenericExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
|
hr = CDrivesExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
|
||||||
}
|
}
|
||||||
else if (IsEqualIID (riid, IID_IDropTarget) && (cidl >= 1))
|
else if (IsEqualIID (riid, IID_IDropTarget) && (cidl >= 1))
|
||||||
{
|
{
|
||||||
|
|
|
@ -516,7 +516,7 @@ HRESULT WINAPI CFSFolder::GetUIObjectOf(HWND hwndOwner,
|
||||||
}
|
}
|
||||||
else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
|
else if ((IsEqualIID (riid, IID_IExtractIconA) || IsEqualIID (riid, IID_IExtractIconW)) && (cidl == 1))
|
||||||
{
|
{
|
||||||
hr = GenericExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
|
hr = CFSExtractIcon_CreateInstance(this, apidl[0], riid, &pObj);
|
||||||
}
|
}
|
||||||
else if (IsEqualIID (riid, IID_IDropTarget))
|
else if (IsEqualIID (riid, IID_IDropTarget))
|
||||||
{
|
{
|
||||||
|
|
|
@ -80,7 +80,8 @@ HRESULT WINAPI IFileSystemBindData_Constructor(const WIN32_FIND_DATAW *pfd, LPBC
|
||||||
HRESULT WINAPI CPanel_ExtractIconA(LPITEMIDLIST pidl, LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize) DECLSPEC_HIDDEN;
|
HRESULT WINAPI CPanel_ExtractIconA(LPITEMIDLIST pidl, LPCSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize) DECLSPEC_HIDDEN;
|
||||||
HRESULT WINAPI CPanel_ExtractIconW(LPITEMIDLIST pidl, LPCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize) DECLSPEC_HIDDEN;
|
HRESULT WINAPI CPanel_ExtractIconW(LPITEMIDLIST pidl, LPCWSTR pszFile, UINT nIconIndex, HICON *phiconLarge, HICON *phiconSmall, UINT nIconSize) DECLSPEC_HIDDEN;
|
||||||
|
|
||||||
HRESULT GenericExtractIcon_CreateInstance(IShellFolder * psf, LPCITEMIDLIST pidl, REFIID iid, LPVOID * ppvOut);
|
HRESULT CGuidItemExtractIcon_CreateInstance(IShellFolder * psf, LPCITEMIDLIST pidl, REFIID iid, LPVOID * ppvOut);
|
||||||
|
HRESULT CFSExtractIcon_CreateInstance(IShellFolder * psf, LPCITEMIDLIST pidl, REFIID iid, LPVOID * ppvOut);
|
||||||
|
|
||||||
/* initialisation for FORMATETC */
|
/* initialisation for FORMATETC */
|
||||||
#define InitFormatEtc(fe, cf, med) \
|
#define InitFormatEtc(fe, cf, med) \
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue