On 8/21/2011 19:20, Jay Yang wrote:
Changes from last time:
Factored out the code to find the registry keys for the extensions.
dlls/shell32/classes.c | 47 +++++++++++++++++++++++++++++++++++++++++ dlls/shell32/shell32_main.h | 1 + dlls/shell32/shfldr.h | 9 +++++++ dlls/shell32/shfldr_desktop.c | 8 ++---- dlls/shell32/shfldr_fs.c | 7 +---- dlls/shell32/shfldr_mycomp.c | 4 +-- dlls/shell32/shfldr_unixfs.c | 11 ++++++--- dlls/shell32/shlmenu.c | 40 ++++++++++++++++++++++++++++++++++ dlls/shell32/shlview.c | 44 +++++++++++++++++++++++++------------- 9 files changed, 139 insertions(+), 32 deletions(-) +HRESULT SHELL_CreateItemContextMenu(HWND hwnd, IShellFolder *folder,
LPITEMIDLIST folder_pidl,
LPCITEMIDLIST *apidl, UINT cidl,
REFIID riid, void **ppv)
+{
- DEFCONTEXTMENU menu_info = {hwnd,NULL,folder_pidl,folder,cidl,apidl,NULL,0,NULL};
- UINT cKeys = 0;
- HKEY aKeys[16] = {NULL};
Where size of 16 comes from?
- UINT i;
- HRESULT hres;
- cKeys = HCR_GetExtensionsKeysForPidl(apidl[0],aKeys);
- menu_info.cKeys=cKeys;
- menu_info.aKeys=aKeys;
- hres = SHCreateDefaultContextMenu(&menu_info,riid,ppv);
- for(i=0;i<cKeys;i++)
if(aKeys[i])
RegCloseKey(aKeys[i]);
RegCloseKey already check for NULL handle.
hr = IShellFolder_CreateViewObject(This->pSFParent,This->hWndParent,&IID_IContextMenu,(void**)&pCM);
if(FAILED(hr)){
LPITEMIDLIST folder_pidl;
IPersistFolder2 *persist;
IShellFolder_QueryInterface(This->pSFParent,&IID_IPersistFolder2,(void**)&persist);
IPersistFolder2_GetCurFolder(persist,&folder_pidl);
IPersistFolder2_Release(persist);
hr= SHELL_CreateBackgroundContextMenu(This->hWndParent,This->pSFParent,
folder_pidl,&IID_IContextMenu,
(void**)&pCM);
ILFree(folder_pidl);
}
I'm not sure about that, but it looks like it deserves some check for 'persist' pointer. Or better a return value being S_OK (from query).