static ULONG WINAPI ContextMenu_AddRef(IContextMenu3 *iface) { ContextMenu *This = impl_from_IContextMenu3(iface); ULONG ref = InterlockedIncrement(&This->ref); TRACE("(%p)->(%u)\n", This, ref); return ref; }
static HRESULT WINAPI CompositeCMenu_GetCommandString(IContextMenu3* iface, UINT_PTR idCmd, UINT uFlags, UINT *pwReserved, LPSTR pszName, UINT cchMax) { CompositeCMenu *This = impl_from_IContextMenu3(iface); UINT index = CompositeCMenu_GetIndexForCommandId(This,idCmd); TRACE("(%p)->(%lx,%x,%p,%s,%u)\n",iface,idCmd,uFlags,pwReserved,pszName,cchMax); return IContextMenu_GetCommandString(This->menus[index],idCmd,uFlags,pwReserved,pszName,cchMax); }
static HRESULT WINAPI ContextMenu_QueryInterface(IContextMenu3 *iface, REFIID riid, LPVOID *ppvObj) { ContextMenu *This = impl_from_IContextMenu3(iface); TRACE("(%p)->(%s %p)\n", This, debugstr_guid(riid), ppvObj); *ppvObj = NULL; if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_IContextMenu) || IsEqualIID(riid, &IID_IContextMenu2) || IsEqualIID(riid, &IID_IContextMenu3)) { *ppvObj = &This->IContextMenu3_iface; } else if (IsEqualIID(riid, &IID_IShellExtInit)) /*IShellExtInit*/ { FIXME("-- LPSHELLEXTINIT pointer requested\n"); } if(*ppvObj) { IContextMenu3_AddRef(iface); return S_OK; } TRACE("-- Interface: E_NOINTERFACE\n"); return E_NOINTERFACE; }
static HRESULT WINAPI ContextMenu_HandleMenuMsg2(IContextMenu3 *iface, UINT msg, WPARAM wParam, LPARAM lParam, LRESULT *result) { ContextMenu *This = impl_from_IContextMenu3(iface); FIXME("(%p)->(0x%x 0x%lx 0x%lx %p): stub\n", This, msg, wParam, lParam, result); return E_NOTIMPL; }
static HRESULT WINAPI CompositeCMenu_HandleMenuMsg(IContextMenu3 *iface, UINT uMsg, WPARAM wParam, LPARAM lParam) { CompositeCMenu *This = impl_from_IContextMenu3(iface); HMENU menu; UINT id; UINT index; IContextMenu2 *handler; HRESULT hres; TRACE("(%p)->(%x,%lx,%lx)\n",iface,uMsg,wParam,lParam); switch(uMsg) { case WM_INITMENUPOPUP: menu = (HMENU)wParam; id = GetMenuItemID(menu,LOWORD(lParam)); break; case WM_DRAWITEM: id = ((DRAWITEMSTRUCT*)lParam)->itemID; break; case WM_MEASUREITEM: id = ((MEASUREITEMSTRUCT*)lParam)->itemID; break; default: WARN("Unimplemented uMsg: 0x%x\n",uMsg); return E_NOTIMPL; } index = CompositeCMenu_GetIndexForCommandId(This,id); hres = IContextMenu_QueryInterface(This->menus[index],&IID_IContextMenu2, (void**)&handler); if(SUCCEEDED(hres)) return IContextMenu2_HandleMenuMsg(handler,uMsg,wParam,lParam); return S_OK; }
static HRESULT WINAPI BackgroundMenu_GetCommandString( IContextMenu3 *iface, UINT_PTR idCommand, UINT uFlags, UINT* lpReserved, LPSTR lpszName, UINT uMaxNameLen) { ContextMenu *This = impl_from_IContextMenu3(iface); TRACE("(%p)->(idcom=%lx flags=%x %p name=%p len=%x)\n",This, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen); /* test the existence of the menu items, the file dialog enables the buttons according to this */ if (uFlags == GCS_VALIDATEA) { if(HIWORD(idCommand)) { if (!strcmp((LPSTR)idCommand, CMDSTR_VIEWLISTA) || !strcmp((LPSTR)idCommand, CMDSTR_VIEWDETAILSA) || !strcmp((LPSTR)idCommand, CMDSTR_NEWFOLDERA)) { return S_OK; } } } FIXME("unknown command string\n"); return E_FAIL; }
static ULONG WINAPI CompositeCMenu_Release(IContextMenu3 *iface) { CompositeCMenu *This = impl_from_IContextMenu3(iface); TRACE("(%p)->()\n",iface); if(--This->refCount) return This->refCount; CompositeCMenu_Destroy(This); return 0; }
static HRESULT WINAPI NewMenu_ContextMenu3_GetCommandString(IContextMenu3 *iface, UINT_PTR cmd, UINT type, UINT *reserved, LPSTR name, UINT max_len) { NewMenuImpl *This = impl_from_IContextMenu3(iface); FIXME("(%p)->(%lu %u %p %p %u): stub\n", This, cmd, type, reserved, name, max_len); return E_NOTIMPL; }
static HRESULT WINAPI NewMenu_ContextMenu3_HandleMenuMsg2(IContextMenu3 *iface, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *result) { NewMenuImpl *This = impl_from_IContextMenu3(iface); TRACE("(%p)->(%u, %lx, %lx, %p)\n", This, uMsg, wParam, lParam, result); switch (uMsg) { case WM_MEASUREITEM: { MEASUREITEMSTRUCT *mis = (MEASUREITEMSTRUCT *)lParam; if (!mis || mis->CtlType != ODT_MENU) break; if (This->folder_cmd == mis->itemID) { mis->itemWidth = GetSystemMetrics(SM_CXSMICON); mis->itemHeight = GetSystemMetrics(SM_CYSMICON); } if (result) *result = TRUE; break; } case WM_DRAWITEM: { DRAWITEMSTRUCT *dis = (DRAWITEMSTRUCT *)lParam; HICON icon = 0; UINT x, y; if (!dis || dis->CtlType != ODT_MENU) break; if (This->folder_cmd == dis->itemID) icon = This->icon_folder; if (!icon) break; x = (dis->rcItem.right - dis->rcItem.left - GetSystemMetrics(SM_CXSMICON)) / 2; y = (dis->rcItem.bottom - dis->rcItem.top - GetSystemMetrics(SM_CYSMICON)) / 2; DrawStateW(dis->hDC, NULL, NULL, (LPARAM)icon, 0, x, y, 0, 0, DST_ICON | DSS_NORMAL); if (result) *result = TRUE; break; } } return S_OK; }
static HRESULT WINAPI CompositeCMenu_QueryContextMenu(IContextMenu3 *iface, HMENU hmenu,UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) { CompositeCMenu *This = impl_from_IContextMenu3(iface); UINT i=0; UINT id_offset=idCmdFirst; TRACE("(%p)->(%p,%u,%u,%u,%x)\n",iface,hmenu,indexMenu,idCmdFirst,idCmdLast,uFlags); for(;i<This->menu_count;i++) { HRESULT hres; This->offsets[i]=id_offset; hres = IContextMenu_QueryContextMenu(This->menus[i],hmenu,indexMenu,id_offset,idCmdLast,uFlags); if(SUCCEEDED(hres)) id_offset+=hres; } return MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, id_offset-idCmdFirst); }
static ULONG WINAPI ContextMenu_Release(IContextMenu3 *iface) { ContextMenu *This = impl_from_IContextMenu3(iface); ULONG ref = InterlockedDecrement(&This->ref); TRACE("(%p)->(%u)\n", This, ref); if (!ref) { if(This->parent) IShellFolder_Release(This->parent); SHFree(This->pidl); _ILFreeaPidl(This->apidl, This->cidl); HeapFree(GetProcessHeap(), 0, This); } return ref; }
/* Background menu implementation */ static HRESULT WINAPI BackgroundMenu_QueryContextMenu( IContextMenu3 *iface, HMENU hMenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) { ContextMenu *This = impl_from_IContextMenu3(iface); HMENU hMyMenu; UINT idMax; HRESULT hr; TRACE("(%p)->(hmenu=%p indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )\n", This, hMenu, indexMenu, idCmdFirst, idCmdLast, uFlags); hMyMenu = LoadMenuA(shell32_hInstance, "MENU_002"); if (uFlags & CMF_DEFAULTONLY) { HMENU ourMenu = GetSubMenu(hMyMenu,0); UINT oldDef = GetMenuDefaultItem(hMenu,TRUE,GMDI_USEDISABLED); UINT newDef = GetMenuDefaultItem(ourMenu,TRUE,GMDI_USEDISABLED); if (newDef != oldDef) SetMenuDefaultItem(hMenu,newDef,TRUE); if (newDef!=0xFFFFFFFF) hr = MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, newDef+1); else hr = MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, 0); } else { idMax = Shell_MergeMenus (hMenu, GetSubMenu(hMyMenu,0), indexMenu, idCmdFirst, idCmdLast, MM_SUBMENUSHAVEIDS); hr = MAKE_HRESULT(SEVERITY_SUCCESS, FACILITY_NULL, idMax-idCmdFirst); } DestroyMenu(hMyMenu); TRACE("(%p)->returning 0x%x\n",This,hr); return hr; }
static HRESULT WINAPI CompositeCMenu_InvokeCommand(IContextMenu3* iface,LPCMINVOKECOMMANDINFO pici) { CompositeCMenu *This = impl_from_IContextMenu3(iface); TRACE("(%p)->(%p)\n",iface,pici); if(HIWORD(pici->lpVerb)) { /*call each handler until one of them succeeds*/ UINT i=0; for(;i<This->menu_count;i++) { HRESULT hres; if(SUCCEEDED(hres=IContextMenu_InvokeCommand(This->menus[i],pici))) return hres; } return E_FAIL; } else { UINT id = (UINT_PTR)pici->lpVerb; UINT index = CompositeCMenu_GetIndexForCommandId(This,id); return IContextMenu_InvokeCommand(This->menus[index],pici); } }
static HRESULT WINAPI NewMenu_ContextMenu3_QueryContextMenu(IContextMenu3 *iface, HMENU menu, UINT index, UINT cmd_first, UINT cmd_last, UINT flags) { static WCHAR newW[] = {'N','e','w',0}; NewMenuImpl *This = impl_from_IContextMenu3(iface); MENUITEMINFOW item; HMENU submenu; UINT id; TRACE("(%p)->(%p, %u, %u, %u, %u)\n", This, menu, index, cmd_first, cmd_last, flags ); if (!This->pidl) return E_FAIL; submenu = CreateMenu(); if (!submenu) return E_FAIL; id = insert_new_menu_items(This, submenu, 0, cmd_first, cmd_last); memset(&item, 0, sizeof(item)); item.cbSize = sizeof(item); item.fMask = MIIM_TYPE | MIIM_ID | MIIM_STATE | MIIM_SUBMENU; item.fType = MFT_STRING; item.wID = -1; item.dwTypeData = newW; /* FIXME: load from resource file */ item.cch = strlenW(newW); item.fState = MFS_ENABLED; item.hSubMenu = submenu; if (!InsertMenuItemW(menu, index, TRUE, &item)) return E_FAIL; return MAKE_HRESULT(SEVERITY_SUCCESS, 0, id); }
static HRESULT WINAPI NewMenu_ContextMenu3_InvokeCommand(IContextMenu3 *iface, LPCMINVOKECOMMANDINFO info) { NewMenuImpl *This = impl_from_IContextMenu3(iface); IShellBrowser *browser; IShellView *view = NULL; HRESULT hr = E_FAIL; TRACE("(%p)->(%p)\n", This, info); /* New Folder */ if (info->lpVerb == 0) { if ((browser = (IShellBrowser *)SendMessageA(info->hwnd, CWM_GETISHELLBROWSER, 0, 0))) { if (FAILED(IShellBrowser_QueryActiveShellView(browser, &view))) view = NULL; } hr = create_folder(This, view); if (view) IShellView_Release(view); } return hr; }
static HRESULT WINAPI ItemMenu_InvokeCommand( IContextMenu3 *iface, LPCMINVOKECOMMANDINFO lpcmi) { ContextMenu *This = impl_from_IContextMenu3(iface); if (lpcmi->cbSize != sizeof(CMINVOKECOMMANDINFO)) FIXME("Is an EX structure\n"); TRACE("(%p)->(invcom=%p verb=%p wnd=%p)\n",This,lpcmi,lpcmi->lpVerb, lpcmi->hwnd); if (IS_INTRESOURCE(lpcmi->lpVerb) && LOWORD(lpcmi->lpVerb) > FCIDM_SHVIEWLAST) { TRACE("Invalid Verb %x\n", LOWORD(lpcmi->lpVerb)); return E_INVALIDARG; } if (IS_INTRESOURCE(lpcmi->lpVerb)) { switch(LOWORD(lpcmi->lpVerb)) { case FCIDM_SHVIEW_EXPLORE: TRACE("Verb FCIDM_SHVIEW_EXPLORE\n"); DoOpenExplore(This, lpcmi->hwnd, "explore"); break; case FCIDM_SHVIEW_OPEN: TRACE("Verb FCIDM_SHVIEW_OPEN\n"); DoOpenExplore(This, lpcmi->hwnd, "open"); break; case FCIDM_SHVIEW_RENAME: { IShellBrowser *browser; /* get the active IShellView */ browser = (IShellBrowser*)SendMessageA(lpcmi->hwnd, CWM_GETISHELLBROWSER, 0, 0); if (browser) { IShellView *view; if(SUCCEEDED(IShellBrowser_QueryActiveShellView(browser, &view))) { TRACE("(shellview=%p)\n", view); IShellView_SelectItem(view, This->apidl[0], SVSI_DESELECTOTHERS|SVSI_EDIT|SVSI_ENSUREVISIBLE|SVSI_FOCUSED|SVSI_SELECT); IShellView_Release(view); } } break; } case FCIDM_SHVIEW_DELETE: TRACE("Verb FCIDM_SHVIEW_DELETE\n"); DoDelete(This); break; case FCIDM_SHVIEW_COPY: TRACE("Verb FCIDM_SHVIEW_COPY\n"); DoCopyOrCut(This, lpcmi->hwnd, FALSE); break; case FCIDM_SHVIEW_CUT: TRACE("Verb FCIDM_SHVIEW_CUT\n"); DoCopyOrCut(This, lpcmi->hwnd, TRUE); break; case FCIDM_SHVIEW_PROPERTIES: TRACE("Verb FCIDM_SHVIEW_PROPERTIES\n"); DoOpenProperties(This, lpcmi->hwnd); break; default: FIXME("Unhandled Verb %xl\n",LOWORD(lpcmi->lpVerb)); return E_INVALIDARG; } } else { TRACE("Verb is %s\n",debugstr_a(lpcmi->lpVerb)); if (strcmp(lpcmi->lpVerb,"delete")==0) DoDelete(This); else if (strcmp(lpcmi->lpVerb,"properties")==0) DoOpenProperties(This, lpcmi->hwnd); else { FIXME("Unhandled string verb %s\n",debugstr_a(lpcmi->lpVerb)); return E_FAIL; } } return S_OK; }
static ULONG WINAPI NewMenu_ContextMenu3_Release(IContextMenu3 *iface) { NewMenuImpl *This = impl_from_IContextMenu3(iface); return NewMenu_ExtInit_Release(&This->IShellExtInit_iface); }
static HRESULT WINAPI NewMenu_ContextMenu3_QueryInterface(IContextMenu3 *iface, REFIID riid, void **ppv) { NewMenuImpl *This = impl_from_IContextMenu3(iface); return NewMenu_ExtInit_QueryInterface(&This->IShellExtInit_iface, riid, ppv); }
static HRESULT WINAPI ItemMenu_GetCommandString( IContextMenu3 *iface, UINT_PTR idCommand, UINT uFlags, UINT* lpReserved, LPSTR lpszName, UINT uMaxNameLen) { ContextMenu *This = impl_from_IContextMenu3(iface); HRESULT hr = E_INVALIDARG; TRACE("(%p)->(%lx flags=%x %p name=%p len=%x)\n", This, idCommand, uFlags, lpReserved, lpszName, uMaxNameLen); switch(uFlags) { case GCS_HELPTEXTA: case GCS_HELPTEXTW: hr = E_NOTIMPL; break; case GCS_VERBA: switch(idCommand) { case FCIDM_SHVIEW_OPEN: strcpy(lpszName, "open"); hr = S_OK; break; case FCIDM_SHVIEW_EXPLORE: strcpy(lpszName, "explore"); hr = S_OK; break; case FCIDM_SHVIEW_CUT: strcpy(lpszName, "cut"); hr = S_OK; break; case FCIDM_SHVIEW_COPY: strcpy(lpszName, "copy"); hr = S_OK; break; case FCIDM_SHVIEW_CREATELINK: strcpy(lpszName, "link"); hr = S_OK; break; case FCIDM_SHVIEW_DELETE: strcpy(lpszName, "delete"); hr = S_OK; break; case FCIDM_SHVIEW_PROPERTIES: strcpy(lpszName, "properties"); hr = S_OK; break; case FCIDM_SHVIEW_RENAME: strcpy(lpszName, "rename"); hr = S_OK; break; } break; /* NT 4.0 with IE 3.0x or no IE will always call This with GCS_VERBW. In This case, you need to do the lstrcpyW to the pointer passed.*/ case GCS_VERBW: switch(idCommand) { case FCIDM_SHVIEW_OPEN: MultiByteToWideChar(CP_ACP, 0, "open", -1, (LPWSTR)lpszName, uMaxNameLen); hr = S_OK; break; case FCIDM_SHVIEW_EXPLORE: MultiByteToWideChar(CP_ACP, 0, "explore", -1, (LPWSTR)lpszName, uMaxNameLen); hr = S_OK; break; case FCIDM_SHVIEW_CUT: MultiByteToWideChar(CP_ACP, 0, "cut", -1, (LPWSTR)lpszName, uMaxNameLen); hr = S_OK; break; case FCIDM_SHVIEW_COPY: MultiByteToWideChar(CP_ACP, 0, "copy", -1, (LPWSTR)lpszName, uMaxNameLen); hr = S_OK; break; case FCIDM_SHVIEW_CREATELINK: MultiByteToWideChar(CP_ACP, 0, "link", -1, (LPWSTR)lpszName, uMaxNameLen); hr = S_OK; break; case FCIDM_SHVIEW_DELETE: MultiByteToWideChar(CP_ACP, 0, "delete", -1, (LPWSTR)lpszName, uMaxNameLen); hr = S_OK; break; case FCIDM_SHVIEW_PROPERTIES: MultiByteToWideChar(CP_ACP, 0, "properties", -1, (LPWSTR)lpszName, uMaxNameLen); hr = S_OK; break; case FCIDM_SHVIEW_RENAME: MultiByteToWideChar( CP_ACP, 0, "rename", -1, (LPWSTR)lpszName, uMaxNameLen ); hr = S_OK; break; } break; case GCS_VALIDATEA: case GCS_VALIDATEW: hr = S_OK; break; } TRACE("-- (%p)->(name=%s)\n", This, lpszName); return hr; }
static HRESULT WINAPI ItemMenu_QueryContextMenu( IContextMenu3 *iface, HMENU hmenu, UINT indexMenu, UINT idCmdFirst, UINT idCmdLast, UINT uFlags) { ContextMenu *This = impl_from_IContextMenu3(iface); INT uIDMax; TRACE("(%p)->(%p %d 0x%x 0x%x 0x%x )\n", This, hmenu, indexMenu, idCmdFirst, idCmdLast, uFlags); if(!(CMF_DEFAULTONLY & uFlags) && This->cidl > 0) { HMENU hmenures = LoadMenuW(shell32_hInstance, MAKEINTRESOURCEW(MENU_SHV_FILE)); if(uFlags & CMF_EXPLORE) RemoveMenu(hmenures, FCIDM_SHVIEW_OPEN, MF_BYCOMMAND); uIDMax = Shell_MergeMenus(hmenu, GetSubMenu(hmenures, 0), indexMenu, idCmdFirst, idCmdLast, MM_SUBMENUSHAVEIDS); DestroyMenu(hmenures); if(This->allvalues) { MENUITEMINFOW mi; WCHAR str[255]; mi.cbSize = sizeof(mi); mi.fMask = MIIM_ID | MIIM_STRING | MIIM_FTYPE; mi.dwTypeData = str; mi.cch = 255; GetMenuItemInfoW(hmenu, FCIDM_SHVIEW_EXPLORE, MF_BYCOMMAND, &mi); RemoveMenu(hmenu, FCIDM_SHVIEW_EXPLORE + idCmdFirst, MF_BYCOMMAND); mi.cbSize = sizeof(mi); mi.fMask = MIIM_ID | MIIM_TYPE | MIIM_STATE | MIIM_STRING; mi.dwTypeData = str; mi.fState = MFS_ENABLED; mi.wID = FCIDM_SHVIEW_EXPLORE; mi.fType = MFT_STRING; InsertMenuItemW(hmenu, (uFlags & CMF_EXPLORE) ? 1 : 2, MF_BYPOSITION, &mi); } SetMenuDefaultItem(hmenu, 0, MF_BYPOSITION); if(uFlags & ~CMF_CANRENAME) RemoveMenu(hmenu, FCIDM_SHVIEW_RENAME, MF_BYCOMMAND); else { UINT enable = MF_BYCOMMAND; /* can't rename more than one item at a time*/ if (!This->apidl || This->cidl > 1) enable |= MFS_DISABLED; else { DWORD attr = SFGAO_CANRENAME; IShellFolder_GetAttributesOf(This->parent, 1, (LPCITEMIDLIST*)This->apidl, &attr); enable |= (attr & SFGAO_CANRENAME) ? MFS_ENABLED : MFS_DISABLED; } EnableMenuItem(hmenu, FCIDM_SHVIEW_RENAME, enable); } return MAKE_HRESULT(SEVERITY_SUCCESS, 0, uIDMax-idCmdFirst); } return MAKE_HRESULT(SEVERITY_SUCCESS, 0, 0); }
static ULONG WINAPI CompositeCMenu_AddRef(IContextMenu3 *iface) { CompositeCMenu *This = impl_from_IContextMenu3(iface); TRACE("(%p)->()\n",iface); return ++This->refCount; }
static HRESULT WINAPI BackgroundMenu_InvokeCommand( IContextMenu3 *iface, LPCMINVOKECOMMANDINFO lpcmi) { ContextMenu *This = impl_from_IContextMenu3(iface); IShellBrowser *browser; IShellView *view = NULL; HWND hWnd = NULL; TRACE("(%p)->(invcom=%p verb=%p wnd=%p)\n", This, lpcmi, lpcmi->lpVerb, lpcmi->hwnd); /* get the active IShellView */ if ((browser = (IShellBrowser*)SendMessageA(lpcmi->hwnd, CWM_GETISHELLBROWSER, 0, 0))) { if (SUCCEEDED(IShellBrowser_QueryActiveShellView(browser, &view))) IShellView_GetWindow(view, &hWnd); } if(HIWORD(lpcmi->lpVerb)) { TRACE("%s\n", debugstr_a(lpcmi->lpVerb)); if (!strcmp(lpcmi->lpVerb, CMDSTR_NEWFOLDERA)) { DoNewFolder(This, view); } else if (!strcmp(lpcmi->lpVerb, CMDSTR_VIEWLISTA)) { if (hWnd) SendMessageA(hWnd, WM_COMMAND, MAKEWPARAM(FCIDM_SHVIEW_LISTVIEW, 0), 0); } else if (!strcmp(lpcmi->lpVerb, CMDSTR_VIEWDETAILSA)) { if (hWnd) SendMessageA(hWnd, WM_COMMAND, MAKEWPARAM(FCIDM_SHVIEW_REPORTVIEW, 0), 0); } else { FIXME("please report: unknown verb %s\n", debugstr_a(lpcmi->lpVerb)); } } else { switch (LOWORD(lpcmi->lpVerb)) { case FCIDM_SHVIEW_REFRESH: if (view) IShellView_Refresh(view); break; case FCIDM_SHVIEW_NEWFOLDER: DoNewFolder(This, view); break; case FCIDM_SHVIEW_INSERT: DoPaste(This); break; case FCIDM_SHVIEW_PROPERTIES: if (This->desktop) { ShellExecuteA(lpcmi->hwnd, "open", "rundll32.exe shell32.dll,Control_RunDLL desk.cpl", NULL, NULL, SW_SHOWNORMAL); } else { FIXME("launch item properties dialog\n"); } break; default: /* if it's an id just pass it to the parent shv */ if (hWnd) SendMessageA(hWnd, WM_COMMAND, MAKEWPARAM(LOWORD(lpcmi->lpVerb), 0), 0); break; } } if (view) IShellView_Release(view); return S_OK; }