mirror of
https://github.com/reactos/reactos.git
synced 2025-08-02 22:37:11 +00:00
[SHELL32]
* Another batch of interface pointers converted to CComPtr. svn path=/branches/shell-experiments/; revision=63909
This commit is contained in:
parent
ef04ff090e
commit
117eba9bd5
12 changed files with 94 additions and 119 deletions
|
@ -177,8 +177,9 @@ static void InitializeTreeView( browse_info *info )
|
||||||
LPITEMIDLIST pidlParent, pidlChild;
|
LPITEMIDLIST pidlParent, pidlChild;
|
||||||
HIMAGELIST hImageList;
|
HIMAGELIST hImageList;
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
IShellFolder *lpsfParent, *lpsfRoot;
|
CComPtr<IShellFolder> lpsfParent;
|
||||||
IEnumIDList * pEnumChildren = NULL;
|
CComPtr<IShellFolder> lpsfRoot;
|
||||||
|
CComPtr<IEnumIDList> pEnumChildren;
|
||||||
HTREEITEM item;
|
HTREEITEM item;
|
||||||
DWORD flags;
|
DWORD flags;
|
||||||
LPCITEMIDLIST root = info->lpBrowseInfo->pidlRoot;
|
LPCITEMIDLIST root = info->lpBrowseInfo->pidlRoot;
|
||||||
|
@ -232,12 +233,10 @@ static void InitializeTreeView( browse_info *info )
|
||||||
hr = lpsfParent->BindToObject(pidlChild, 0, IID_PPV_ARG(IShellFolder, &lpsfRoot));
|
hr = lpsfParent->BindToObject(pidlChild, 0, IID_PPV_ARG(IShellFolder, &lpsfRoot));
|
||||||
} else {
|
} else {
|
||||||
lpsfRoot = lpsfParent;
|
lpsfRoot = lpsfParent;
|
||||||
hr = lpsfParent->AddRef();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
WARN("Could not bind to root shell folder! hr = %08x\n", hr);
|
WARN("Could not bind to root shell folder! hr = %08x\n", hr);
|
||||||
lpsfParent->Release();
|
|
||||||
ILFree(pidlChild);
|
ILFree(pidlChild);
|
||||||
ILFree(pidlParent);
|
ILFree(pidlParent);
|
||||||
return;
|
return;
|
||||||
|
@ -247,8 +246,6 @@ static void InitializeTreeView( browse_info *info )
|
||||||
hr = lpsfRoot->EnumObjects(info->hWnd, flags, &pEnumChildren );
|
hr = lpsfRoot->EnumObjects(info->hWnd, flags, &pEnumChildren );
|
||||||
if (FAILED(hr)) {
|
if (FAILED(hr)) {
|
||||||
WARN("Could not get child iterator! hr = %08x\n", hr);
|
WARN("Could not get child iterator! hr = %08x\n", hr);
|
||||||
lpsfParent->Release();
|
|
||||||
lpsfRoot->Release();
|
|
||||||
ILFree(pidlChild);
|
ILFree(pidlChild);
|
||||||
ILFree(pidlParent);
|
ILFree(pidlParent);
|
||||||
return;
|
return;
|
||||||
|
@ -261,8 +258,6 @@ static void InitializeTreeView( browse_info *info )
|
||||||
|
|
||||||
ILFree(pidlChild);
|
ILFree(pidlChild);
|
||||||
ILFree(pidlParent);
|
ILFree(pidlParent);
|
||||||
lpsfRoot->Release();
|
|
||||||
lpsfParent->Release();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int GetIcon(LPCITEMIDLIST lpi, UINT uFlags)
|
static int GetIcon(LPCITEMIDLIST lpi, UINT uFlags)
|
||||||
|
@ -366,6 +361,7 @@ static HTREEITEM InsertTreeViewItem( browse_info *info, IShellFolder * lpsf,
|
||||||
tvi.lParam = (LPARAM)lptvid;
|
tvi.lParam = (LPARAM)lptvid;
|
||||||
|
|
||||||
lpsf->AddRef();
|
lpsf->AddRef();
|
||||||
|
pEnumIL->AddRef();
|
||||||
lptvid->lpsfParent = lpsf;
|
lptvid->lpsfParent = lpsf;
|
||||||
lptvid->lpi = ILClone(pidl);
|
lptvid->lpi = ILClone(pidl);
|
||||||
lptvid->lpifq = pidlParent ? ILCombine(pidlParent, pidl) : ILClone(pidl);
|
lptvid->lpifq = pidlParent ? ILCombine(pidlParent, pidl) : ILClone(pidl);
|
||||||
|
@ -411,8 +407,8 @@ static void FillTreeView( browse_info *info, IShellFolder * lpsf,
|
||||||
while (S_OK == lpe->Next(1,&pidlTemp,&ulFetched))
|
while (S_OK == lpe->Next(1,&pidlTemp,&ulFetched))
|
||||||
{
|
{
|
||||||
ULONG ulAttrs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER;
|
ULONG ulAttrs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER;
|
||||||
IEnumIDList* pEnumIL = NULL;
|
CComPtr<IEnumIDList> pEnumIL;
|
||||||
IShellFolder* pSFChild = NULL;
|
CComPtr<IShellFolder> pSFChild;
|
||||||
lpsf->GetAttributesOf(1, (LPCITEMIDLIST*)&pidlTemp, &ulAttrs);
|
lpsf->GetAttributesOf(1, (LPCITEMIDLIST*)&pidlTemp, &ulAttrs);
|
||||||
if (ulAttrs & SFGAO_FOLDER)
|
if (ulAttrs & SFGAO_FOLDER)
|
||||||
{
|
{
|
||||||
|
@ -426,11 +422,9 @@ static void FillTreeView( browse_info *info, IShellFolder * lpsf,
|
||||||
if ((pEnumIL->Skip(1) != S_OK) ||
|
if ((pEnumIL->Skip(1) != S_OK) ||
|
||||||
FAILED(pEnumIL->Reset()))
|
FAILED(pEnumIL->Reset()))
|
||||||
{
|
{
|
||||||
pEnumIL->Release();
|
|
||||||
pEnumIL = NULL;
|
pEnumIL = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pSFChild->Release();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -508,7 +502,7 @@ static LRESULT BrsFolder_Treeview_Delete( browse_info *info, NMTREEVIEWW *pnmtv
|
||||||
|
|
||||||
static LRESULT BrsFolder_Treeview_Expand( browse_info *info, NMTREEVIEWW *pnmtv )
|
static LRESULT BrsFolder_Treeview_Expand( browse_info *info, NMTREEVIEWW *pnmtv )
|
||||||
{
|
{
|
||||||
IShellFolder *lpsf2 = NULL;
|
CComPtr<IShellFolder> lpsf2;
|
||||||
LPTV_ITEMDATA lptvid = (LPTV_ITEMDATA) pnmtv->itemNew.lParam;
|
LPTV_ITEMDATA lptvid = (LPTV_ITEMDATA) pnmtv->itemNew.lParam;
|
||||||
HRESULT r;
|
HRESULT r;
|
||||||
|
|
||||||
|
|
|
@ -308,7 +308,7 @@ HasClipboardData()
|
||||||
STGMEDIUM medium;
|
STGMEDIUM medium;
|
||||||
FORMATETC formatetc;
|
FORMATETC formatetc;
|
||||||
|
|
||||||
TRACE("pDataObj=%p\n", pDataObj);
|
TRACE("pDataObj=%p\n", pDataObj.p);
|
||||||
|
|
||||||
/* Set the FORMATETC structure*/
|
/* Set the FORMATETC structure*/
|
||||||
InitFormatEtc(formatetc, RegisterClipboardFormatW(CFSTR_SHELLIDLIST), TYMED_HGLOBAL);
|
InitFormatEtc(formatetc, RegisterClipboardFormatW(CFSTR_SHELLIDLIST), TYMED_HGLOBAL);
|
||||||
|
@ -933,15 +933,13 @@ NotifyShellViewWindow(LPCMINVOKECOMMANDINFO lpcmi, BOOL bRefresh)
|
||||||
if (!lpSB)
|
if (!lpSB)
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
|
||||||
IShellView * lpSV = NULL;
|
CComPtr<IShellView> lpSV;
|
||||||
if (FAILED(lpSB->QueryActiveShellView(&lpSV)))
|
if (FAILED(lpSB->QueryActiveShellView(&lpSV)))
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
|
||||||
HWND hwndSV = NULL;
|
HWND hwndSV = NULL;
|
||||||
if (SUCCEEDED(lpSV->GetWindow(&hwndSV)))
|
if (SUCCEEDED(lpSV->GetWindow(&hwndSV)))
|
||||||
SendMessageW(hwndSV, WM_COMMAND, MAKEWPARAM(LOWORD(lpcmi->lpVerb), 0), 0);
|
SendMessageW(hwndSV, WM_COMMAND, MAKEWPARAM(LOWORD(lpcmi->lpVerb), 0), 0);
|
||||||
|
|
||||||
lpSV->Release();
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -241,11 +241,11 @@ IExtractIconW* IExtractIconW_Constructor(LPCITEMIDLIST pidl)
|
||||||
{
|
{
|
||||||
static const WCHAR szFull[] = {'F','u','l','l',0};
|
static const WCHAR szFull[] = {'F','u','l','l',0};
|
||||||
static const WCHAR szEmpty[] = {'E','m','p','t','y',0};
|
static const WCHAR szEmpty[] = {'E','m','p','t','y',0};
|
||||||
IEnumIDList *EnumIDList = NULL;
|
CComPtr<IEnumIDList> EnumIDList;
|
||||||
CoInitialize(NULL);
|
CoInitialize(NULL);
|
||||||
|
|
||||||
IShellFolder2 *psfRecycleBin = NULL;
|
CComPtr<IShellFolder2> psfRecycleBin;
|
||||||
IShellFolder *psfDesktop = NULL;
|
CComPtr<IShellFolder> psfDesktop;
|
||||||
hr = SHGetDesktopFolder(&psfDesktop);
|
hr = SHGetDesktopFolder(&psfDesktop);
|
||||||
|
|
||||||
if (SUCCEEDED(hr))
|
if (SUCCEEDED(hr))
|
||||||
|
@ -262,13 +262,6 @@ IExtractIconW* IExtractIconW_Constructor(LPCITEMIDLIST pidl)
|
||||||
} else {
|
} else {
|
||||||
iconname = szEmpty;
|
iconname = szEmpty;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (psfDesktop)
|
|
||||||
psfDesktop->Release();
|
|
||||||
if (psfRecycleBin)
|
|
||||||
psfRecycleBin->Release();
|
|
||||||
if (EnumIDList)
|
|
||||||
EnumIDList->Release();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (HCR_GetIconW(xriid, wTemp, iconname, MAX_PATH, &icon_idx))
|
if (HCR_GetIconW(xriid, wTemp, iconname, MAX_PATH, &icon_idx))
|
||||||
|
|
|
@ -544,12 +544,7 @@ HRESULT STDMETHODCALLTYPE CNewMenu::SetSite(IUnknown *pUnkSite)
|
||||||
|
|
||||||
HRESULT STDMETHODCALLTYPE CNewMenu::GetSite(REFIID riid, void **ppvSite)
|
HRESULT STDMETHODCALLTYPE CNewMenu::GetSite(REFIID riid, void **ppvSite)
|
||||||
{
|
{
|
||||||
if (ppvSite == NULL)
|
return m_pSite->QueryInterface(riid, ppvSite);
|
||||||
return E_POINTER;
|
|
||||||
*ppvSite = m_pSite;
|
|
||||||
if (m_pSite != NULL)
|
|
||||||
m_pSite->AddRef();
|
|
||||||
return S_OK;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT
|
HRESULT
|
||||||
|
@ -596,8 +591,8 @@ HRESULT
|
||||||
WINAPI
|
WINAPI
|
||||||
CNewMenu::InvokeCommand(LPCMINVOKECOMMANDINFO lpici)
|
CNewMenu::InvokeCommand(LPCMINVOKECOMMANDINFO lpici)
|
||||||
{
|
{
|
||||||
IShellBrowser *lpSB = NULL;
|
CComPtr<IShellBrowser> lpSB;
|
||||||
CComPtr<IShellView> lpSV = NULL;
|
CComPtr<IShellView> lpSV;
|
||||||
HRESULT hr = E_FAIL;
|
HRESULT hr = E_FAIL;
|
||||||
|
|
||||||
/* Note: CWM_GETISHELLBROWSER returns shell browser without adding reference */
|
/* Note: CWM_GETISHELLBROWSER returns shell browser without adding reference */
|
||||||
|
|
|
@ -54,7 +54,7 @@ private:
|
||||||
LPWSTR m_wszPath;
|
LPWSTR m_wszPath;
|
||||||
SHELLNEW_ITEM *m_pItems;
|
SHELLNEW_ITEM *m_pItems;
|
||||||
SHELLNEW_ITEM *m_pLinkItem;
|
SHELLNEW_ITEM *m_pLinkItem;
|
||||||
IUnknown *m_pSite;
|
CComPtr<IUnknown> m_pSite;
|
||||||
HMENU m_hSubMenu;
|
HMENU m_hSubMenu;
|
||||||
HBITMAP m_hbmFolder, m_hbmLink;
|
HBITMAP m_hbmFolder, m_hbmLink;
|
||||||
|
|
||||||
|
|
|
@ -71,7 +71,7 @@ static BOOL ILGetDisplayNameExA(IShellFolder * psf, LPCITEMIDLIST pidl, LPSTR pa
|
||||||
BOOL WINAPI ILGetDisplayNameExW(IShellFolder * psf, LPCITEMIDLIST pidl, LPWSTR path, DWORD type)
|
BOOL WINAPI ILGetDisplayNameExW(IShellFolder * psf, LPCITEMIDLIST pidl, LPWSTR path, DWORD type)
|
||||||
{
|
{
|
||||||
CComPtr<IShellFolder> psfParent;
|
CComPtr<IShellFolder> psfParent;
|
||||||
IShellFolder * lsf = psf;
|
CComPtr<IShellFolder> lsf = psf;
|
||||||
HRESULT ret = NO_ERROR;
|
HRESULT ret = NO_ERROR;
|
||||||
LPCITEMIDLIST pidllast;
|
LPCITEMIDLIST pidllast;
|
||||||
STRRET strret;
|
STRRET strret;
|
||||||
|
@ -133,8 +133,6 @@ BOOL WINAPI ILGetDisplayNameExW(IShellFolder * psf, LPCITEMIDLIST pidl, LPWSTR p
|
||||||
|
|
||||||
TRACE("%p %p %s\n", psf, pidl, debugstr_w(path));
|
TRACE("%p %p %s\n", psf, pidl, debugstr_w(path));
|
||||||
|
|
||||||
if (!psf)
|
|
||||||
lsf->Release();
|
|
||||||
return SUCCEEDED(ret);
|
return SUCCEEDED(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -76,7 +76,7 @@ private:
|
||||||
BOOL bDirty;
|
BOOL bDirty;
|
||||||
INT iIdOpen; /* id of the "Open" entry in the context menu */
|
INT iIdOpen; /* id of the "Open" entry in the context menu */
|
||||||
CComPtr<IUnknown> site;
|
CComPtr<IUnknown> site;
|
||||||
IDropTarget *mDropTarget;
|
CComPtr<IDropTarget> mDropTarget;
|
||||||
public:
|
public:
|
||||||
CShellLink();
|
CShellLink();
|
||||||
~CShellLink();
|
~CShellLink();
|
||||||
|
|
|
@ -2275,10 +2275,11 @@ EXTERN_C HRESULT WINAPI SHGetImageList(int iImageList, REFIID riid, void **ppv)
|
||||||
/* Get the interface for the new image list */
|
/* Get the interface for the new image list */
|
||||||
if (hNew)
|
if (hNew)
|
||||||
{
|
{
|
||||||
IImageList *imageList = (IImageList*) hNew;
|
IImageList *imageList = reinterpret_cast<IImageList*>(hNew);
|
||||||
ret = imageList->QueryInterface(riid, ppv);
|
ret = imageList->QueryInterface(riid, ppv);
|
||||||
|
|
||||||
ImageList_Destroy(hNew);
|
// Since we are not duplicating, destroying makes no sense.
|
||||||
|
/* ImageList_Destroy(hNew); */
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -1274,8 +1274,8 @@ static HKEY ShellExecute_GetClassKey(const SHELLEXECUTEINFOW *sei)
|
||||||
static IDataObject *shellex_get_dataobj( LPSHELLEXECUTEINFOW sei )
|
static IDataObject *shellex_get_dataobj( LPSHELLEXECUTEINFOW sei )
|
||||||
{
|
{
|
||||||
LPCITEMIDLIST pidllast = NULL;
|
LPCITEMIDLIST pidllast = NULL;
|
||||||
IDataObject *dataobj = NULL;
|
CComPtr<IDataObject> dataobj;
|
||||||
IShellFolder *shf = NULL;
|
CComPtr<IShellFolder> shf;
|
||||||
LPITEMIDLIST pidl = NULL;
|
LPITEMIDLIST pidl = NULL;
|
||||||
HRESULT r;
|
HRESULT r;
|
||||||
|
|
||||||
|
@ -1303,15 +1303,13 @@ static IDataObject *shellex_get_dataobj( LPSHELLEXECUTEINFOW sei )
|
||||||
end:
|
end:
|
||||||
if (pidl != sei->lpIDList)
|
if (pidl != sei->lpIDList)
|
||||||
ILFree(pidl);
|
ILFree(pidl);
|
||||||
if (shf)
|
return dataobj.Detach();
|
||||||
shf->Release();
|
|
||||||
return dataobj;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT shellex_run_context_menu_default(IShellExtInit *obj,
|
static HRESULT shellex_run_context_menu_default(IShellExtInit *obj,
|
||||||
LPSHELLEXECUTEINFOW sei)
|
LPSHELLEXECUTEINFOW sei)
|
||||||
{
|
{
|
||||||
IContextMenu *cm = NULL;
|
CComPtr<IContextMenu> cm = NULL;
|
||||||
CMINVOKECOMMANDINFOEX ici;
|
CMINVOKECOMMANDINFOEX ici;
|
||||||
MENUITEMINFOW info;
|
MENUITEMINFOW info;
|
||||||
WCHAR string[0x80];
|
WCHAR string[0x80];
|
||||||
|
@ -1374,13 +1372,12 @@ static HRESULT shellex_run_context_menu_default(IShellExtInit *obj,
|
||||||
end:
|
end:
|
||||||
if (hmenu)
|
if (hmenu)
|
||||||
DestroyMenu( hmenu );
|
DestroyMenu( hmenu );
|
||||||
if (cm)
|
|
||||||
cm->Release();
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT shellex_load_object_and_run(HKEY hkey, LPCGUID guid, LPSHELLEXECUTEINFOW sei)
|
static HRESULT shellex_load_object_and_run(HKEY hkey, LPCGUID guid, LPSHELLEXECUTEINFOW sei)
|
||||||
{
|
{
|
||||||
|
// Can not use CComPtr here because of CoUninitialize at the end, before the destructors would run.
|
||||||
IDataObject *dataobj = NULL;
|
IDataObject *dataobj = NULL;
|
||||||
IObjectWithSite *ows = NULL;
|
IObjectWithSite *ows = NULL;
|
||||||
IShellExtInit *obj = NULL;
|
IShellExtInit *obj = NULL;
|
||||||
|
|
|
@ -204,7 +204,7 @@ static HRESULT SHELL32_CoCreateInitSF (LPCITEMIDLIST pidlRoot, LPCWSTR pathRoot,
|
||||||
LPCITEMIDLIST pidlChild, REFCLSID clsid, LPVOID * ppvOut)
|
LPCITEMIDLIST pidlChild, REFCLSID clsid, LPVOID * ppvOut)
|
||||||
{
|
{
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
IShellFolder* pShellFolder = NULL;
|
CComPtr<IShellFolder> pShellFolder;
|
||||||
|
|
||||||
TRACE ("%p %s %p\n", pidlRoot, debugstr_w(pathRoot), pidlChild);
|
TRACE ("%p %s %p\n", pidlRoot, debugstr_w(pathRoot), pidlChild);
|
||||||
|
|
||||||
|
@ -250,7 +250,7 @@ static HRESULT SHELL32_CoCreateInitSF (LPCITEMIDLIST pidlRoot, LPCWSTR pathRoot,
|
||||||
ILFree (pidlAbsolute);
|
ILFree (pidlAbsolute);
|
||||||
}
|
}
|
||||||
|
|
||||||
*ppvOut = pShellFolder;
|
*ppvOut = pShellFolder.Detach();
|
||||||
|
|
||||||
TRACE ("-- (%p) ret=0x%08x\n", *ppvOut, hr);
|
TRACE ("-- (%p) ret=0x%08x\n", *ppvOut, hr);
|
||||||
|
|
||||||
|
@ -490,12 +490,11 @@ HRESULT SHELL32_GetItemAttributes (IShellFolder * psf, LPCITEMIDLIST pidl, LPDWO
|
||||||
CComPtr<IShellFolder> psf2;
|
CComPtr<IShellFolder> psf2;
|
||||||
if (SUCCEEDED(psf->BindToObject(pidl, 0, IID_PPV_ARG(IShellFolder, &psf2))))
|
if (SUCCEEDED(psf->BindToObject(pidl, 0, IID_PPV_ARG(IShellFolder, &psf2))))
|
||||||
{
|
{
|
||||||
IEnumIDList *pEnumIL = NULL;
|
CComPtr<IEnumIDList> pEnumIL;
|
||||||
if (SUCCEEDED(psf2->EnumObjects(0, SHCONTF_FOLDERS, &pEnumIL)))
|
if (SUCCEEDED(psf2->EnumObjects(0, SHCONTF_FOLDERS, &pEnumIL)))
|
||||||
{
|
{
|
||||||
if (pEnumIL->Skip(1) != S_OK)
|
if (pEnumIL->Skip(1) != S_OK)
|
||||||
*pdwAttributes &= ~SFGAO_HASSUBFOLDER;
|
*pdwAttributes &= ~SFGAO_HASSUBFOLDER;
|
||||||
pEnumIL->Release();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -114,7 +114,9 @@ static LPFMINFO FM_SetMenuParameter(
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static int FM_InitMenuPopup(HMENU hmenu, LPCITEMIDLIST pAlternatePidl)
|
static int FM_InitMenuPopup(HMENU hmenu, LPCITEMIDLIST pAlternatePidl)
|
||||||
{ IShellFolder *lpsf, *lpsf2;
|
{
|
||||||
|
CComPtr<IShellFolder> lpsf;
|
||||||
|
CComPtr<IShellFolder> lpsf2;
|
||||||
ULONG ulItemAttr = SFGAO_FOLDER;
|
ULONG ulItemAttr = SFGAO_FOLDER;
|
||||||
UINT uID, uEnumFlags;
|
UINT uID, uEnumFlags;
|
||||||
LPFNFMCALLBACK lpfnCallback;
|
LPFNFMCALLBACK lpfnCallback;
|
||||||
|
@ -129,23 +131,23 @@ static int FM_InitMenuPopup(HMENU hmenu, LPCITEMIDLIST pAlternatePidl)
|
||||||
MenuInfo.cbSize = sizeof(MENUINFO);
|
MenuInfo.cbSize = sizeof(MENUINFO);
|
||||||
MenuInfo.fMask = MIM_MENUDATA;
|
MenuInfo.fMask = MIM_MENUDATA;
|
||||||
|
|
||||||
if (! GetMenuInfo(hmenu, &MenuInfo))
|
if (!GetMenuInfo(hmenu, &MenuInfo))
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
menudata = (LPFMINFO)MenuInfo.dwMenuData;
|
menudata = (LPFMINFO) MenuInfo.dwMenuData;
|
||||||
|
|
||||||
if ((menudata == 0) || (MenuInfo.cbSize != sizeof(MENUINFO)))
|
if ((menudata == 0) || (MenuInfo.cbSize != sizeof(MENUINFO)))
|
||||||
{
|
{
|
||||||
ERR("menudata corrupt: %p %u\n", menudata, MenuInfo.cbSize);
|
ERR("menudata corrupt: %p %u\n", menudata, MenuInfo.cbSize);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (menudata->bInitialized)
|
if (menudata->bInitialized)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
pidl = (pAlternatePidl? pAlternatePidl: menudata->pidl);
|
pidl = (pAlternatePidl ? pAlternatePidl : menudata->pidl);
|
||||||
if (!pidl)
|
if (!pidl)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
uID = menudata->uID;
|
uID = menudata->uID;
|
||||||
uEnumFlags = menudata->uEnumFlags;
|
uEnumFlags = menudata->uEnumFlags;
|
||||||
|
@ -154,73 +156,70 @@ static int FM_InitMenuPopup(HMENU hmenu, LPCITEMIDLIST pAlternatePidl)
|
||||||
|
|
||||||
SetMenuInfo(hmenu, &MenuInfo);
|
SetMenuInfo(hmenu, &MenuInfo);
|
||||||
|
|
||||||
if (SUCCEEDED (SHGetDesktopFolder(&lpsf)))
|
if (SUCCEEDED(SHGetDesktopFolder(&lpsf)))
|
||||||
{
|
{
|
||||||
if (SUCCEEDED(lpsf->BindToObject(pidl, 0, IID_PPV_ARG(IShellFolder, &lpsf2))))
|
if (SUCCEEDED(lpsf->BindToObject(pidl, 0, IID_PPV_ARG(IShellFolder, &lpsf2))))
|
||||||
{
|
|
||||||
IEnumIDList *lpe = NULL;
|
|
||||||
|
|
||||||
if (SUCCEEDED (lpsf2->EnumObjects(0, uEnumFlags, &lpe )))
|
|
||||||
{
|
{
|
||||||
|
CComPtr<IEnumIDList> lpe;
|
||||||
|
|
||||||
LPITEMIDLIST pidlTemp = NULL;
|
if (SUCCEEDED(lpsf2->EnumObjects(0, uEnumFlags, &lpe)))
|
||||||
ULONG ulFetched;
|
{
|
||||||
|
|
||||||
while ((!bAbortInit) && (S_OK == lpe->Next(1,&pidlTemp,&ulFetched)))
|
LPITEMIDLIST pidlTemp = NULL;
|
||||||
{
|
ULONG ulFetched;
|
||||||
if (SUCCEEDED (lpsf->GetAttributesOf(1, (LPCITEMIDLIST*)&pidlTemp, &ulItemAttr)))
|
|
||||||
{
|
|
||||||
ILGetDisplayNameExW(NULL, pidlTemp, sTemp, ILGDN_FORPARSING);
|
|
||||||
if (! (PidlToSicIndex(lpsf, pidlTemp, FALSE, 0, &iIcon)))
|
|
||||||
iIcon = FM_BLANK_ICON;
|
|
||||||
if ( SFGAO_FOLDER & ulItemAttr)
|
|
||||||
{
|
|
||||||
LPFMINFO lpFmMi;
|
|
||||||
MENUINFO MenuInfo;
|
|
||||||
HMENU hMenuPopup = CreatePopupMenu();
|
|
||||||
|
|
||||||
lpFmMi = (LPFMINFO)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(FMINFO));
|
while ((!bAbortInit) && (S_OK == lpe->Next(1, &pidlTemp, &ulFetched)))
|
||||||
|
{
|
||||||
|
if (SUCCEEDED(lpsf->GetAttributesOf(1, (LPCITEMIDLIST*) &pidlTemp, &ulItemAttr)))
|
||||||
|
{
|
||||||
|
ILGetDisplayNameExW(NULL, pidlTemp, sTemp, ILGDN_FORPARSING);
|
||||||
|
if (!(PidlToSicIndex(lpsf, pidlTemp, FALSE, 0, &iIcon)))
|
||||||
|
iIcon = FM_BLANK_ICON;
|
||||||
|
if (SFGAO_FOLDER & ulItemAttr)
|
||||||
|
{
|
||||||
|
LPFMINFO lpFmMi;
|
||||||
|
MENUINFO MenuInfo;
|
||||||
|
HMENU hMenuPopup = CreatePopupMenu();
|
||||||
|
|
||||||
lpFmMi->pidl = ILCombine(pidl, pidlTemp);
|
lpFmMi = (LPFMINFO) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(FMINFO));
|
||||||
lpFmMi->uEnumFlags = SHCONTF_FOLDERS | SHCONTF_NONFOLDERS;
|
|
||||||
|
|
||||||
MenuInfo.cbSize = sizeof(MENUINFO);
|
lpFmMi->pidl = ILCombine(pidl, pidlTemp);
|
||||||
MenuInfo.fMask = MIM_MENUDATA;
|
lpFmMi->uEnumFlags = SHCONTF_FOLDERS | SHCONTF_NONFOLDERS;
|
||||||
MenuInfo.dwMenuData = (ULONG_PTR) lpFmMi;
|
|
||||||
SetMenuInfo (hMenuPopup, &MenuInfo);
|
|
||||||
|
|
||||||
FileMenu_AppendItemW (hmenu, sTemp, uID, iIcon, hMenuPopup, FM_DEFAULT_HEIGHT);
|
MenuInfo.cbSize = sizeof(MENUINFO);
|
||||||
}
|
MenuInfo.fMask = MIM_MENUDATA;
|
||||||
else
|
MenuInfo.dwMenuData = (ULONG_PTR) lpFmMi;
|
||||||
{
|
SetMenuInfo(hMenuPopup, &MenuInfo);
|
||||||
LPWSTR pExt = PathFindExtensionW(sTemp);
|
|
||||||
if (pExt)
|
FileMenu_AppendItemW(hmenu, sTemp, uID, iIcon, hMenuPopup, FM_DEFAULT_HEIGHT);
|
||||||
*pExt = 0;
|
}
|
||||||
FileMenu_AppendItemW (hmenu, sTemp, uID, iIcon, 0, FM_DEFAULT_HEIGHT);
|
else
|
||||||
}
|
{
|
||||||
|
LPWSTR pExt = PathFindExtensionW(sTemp);
|
||||||
|
if (pExt)
|
||||||
|
*pExt = 0;
|
||||||
|
FileMenu_AppendItemW(hmenu, sTemp, uID, iIcon, 0, FM_DEFAULT_HEIGHT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lpfnCallback)
|
||||||
|
{
|
||||||
|
TRACE("enter callback\n");
|
||||||
|
lpfnCallback(pidl, pidlTemp);
|
||||||
|
TRACE("leave callback\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
NumberOfItems++;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lpfnCallback)
|
|
||||||
{
|
|
||||||
TRACE("enter callback\n");
|
|
||||||
lpfnCallback ( pidl, pidlTemp);
|
|
||||||
TRACE("leave callback\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
NumberOfItems++;
|
|
||||||
}
|
|
||||||
lpe->Release();
|
|
||||||
}
|
|
||||||
lpsf2->Release();
|
|
||||||
}
|
|
||||||
lpsf->Release();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( GetMenuItemCount (hmenu) == 0 )
|
if (GetMenuItemCount(hmenu) == 0)
|
||||||
{
|
{
|
||||||
static const WCHAR szEmpty[] = { '(','e','m','p','t','y',')',0 };
|
static const WCHAR szEmpty [] = { '(', 'e', 'm', 'p', 't', 'y', ')', 0 };
|
||||||
FileMenu_AppendItemW (hmenu, szEmpty, uID, FM_BLANK_ICON, 0, FM_DEFAULT_HEIGHT);
|
FileMenu_AppendItemW(hmenu, szEmpty, uID, FM_BLANK_ICON, 0, FM_DEFAULT_HEIGHT);
|
||||||
NumberOfItems++;
|
NumberOfItems++;
|
||||||
}
|
}
|
||||||
|
|
||||||
menudata->bInitialized = TRUE;
|
menudata->bInitialized = TRUE;
|
||||||
|
@ -228,6 +227,7 @@ static int FM_InitMenuPopup(HMENU hmenu, LPCITEMIDLIST pAlternatePidl)
|
||||||
|
|
||||||
return NumberOfItems;
|
return NumberOfItems;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*************************************************************************
|
/*************************************************************************
|
||||||
* FileMenu_Create [SHELL32.114]
|
* FileMenu_Create [SHELL32.114]
|
||||||
*
|
*
|
||||||
|
|
|
@ -1761,7 +1761,7 @@ LRESULT CDefView::OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandl
|
||||||
|
|
||||||
if (SUCCEEDED(m_pSFParent->GetUIObjectOf(m_hWnd, m_cidl, (LPCITEMIDLIST*)m_apidl, IID_NULL_PPV_ARG(IDataObject, &pda))))
|
if (SUCCEEDED(m_pSFParent->GetUIObjectOf(m_hWnd, m_cidl, (LPCITEMIDLIST*)m_apidl, IID_NULL_PPV_ARG(IDataObject, &pda))))
|
||||||
{
|
{
|
||||||
IDropSource * pds = (IDropSource *)this; /* own DropSource interface */
|
CComPtr<IDropSource> pds = static_cast<IDropSource *>(this); /* own DropSource interface */
|
||||||
|
|
||||||
if (SUCCEEDED(m_pSFParent->GetAttributesOf(m_cidl, (LPCITEMIDLIST*)m_apidl, &dwAttributes)))
|
if (SUCCEEDED(m_pSFParent->GetAttributesOf(m_cidl, (LPCITEMIDLIST*)m_apidl, &dwAttributes)))
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue