/************************************************************************** * DoRename */ static void DoRename(ItemCmImpl *This, HWND hwnd) { LPSHELLBROWSER lpSB; LPSHELLVIEW lpSV; TRACE("(%p)->(wnd=%p)\n",This, hwnd); /* get the active IShellView */ if ((lpSB = (LPSHELLBROWSER)SendMessageA(hwnd, CWM_GETISHELLBROWSER,0,0))) { if(SUCCEEDED(IShellBrowser_QueryActiveShellView(lpSB, &lpSV))) { TRACE("(sv=%p)\n",lpSV); IShellView_SelectItem(lpSV, This->apidl[0], SVSI_DESELECTOTHERS|SVSI_EDIT|SVSI_ENSUREVISIBLE|SVSI_FOCUSED|SVSI_SELECT); IShellView_Release(lpSV); } } }
/************************************************************************** * DoCopyOrCut * * copies the currently selected items into the clipboard */ static BOOL DoCopyOrCut(ItemCmImpl *This, HWND hwnd, BOOL bCut) { LPSHELLBROWSER lpSB; LPSHELLVIEW lpSV; LPDATAOBJECT lpDo; TRACE("(%p)->(wnd=%p,bCut=0x%08x)\n",This, hwnd, bCut); /* get the active IShellView */ if ((lpSB = (LPSHELLBROWSER)SendMessageA(hwnd, CWM_GETISHELLBROWSER,0,0))) { if (SUCCEEDED(IShellBrowser_QueryActiveShellView(lpSB, &lpSV))) { if (SUCCEEDED(IShellView_GetItemObject(lpSV, SVGIO_SELECTION, &IID_IDataObject, (LPVOID*)&lpDo))) { OleSetClipboard(lpDo); IDataObject_Release(lpDo); } IShellView_Release(lpSV); } } return TRUE; }
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 UINT_PTR CALLBACK create_view_window2_hook(HWND dlg, UINT msg, WPARAM wParam, LPARAM lParam) { if (msg == WM_NOTIFY) { if (((LPNMHDR)lParam)->code == CDN_FOLDERCHANGE) { IShellBrowser *shell_browser = (IShellBrowser *)SendMessage(GetParent(dlg), WM_USER + 7 /* WM_GETISHELLBROWSER */, 0, 0); IShellView *shell_view = NULL; IShellView2 *shell_view2 = NULL; SV2CVW2_PARAMS view_params; FOLDERSETTINGS folder_settings; HRESULT hr; RECT rect = {0, 0, 0, 0}; hr = IShellBrowser_QueryActiveShellView(shell_browser, &shell_view); ok(SUCCEEDED(hr), "QueryActiveShellView returned %#x\n", hr); if (FAILED(hr)) goto cleanup; hr = IShellView_QueryInterface(shell_view, &IID_IShellView2, (void **)&shell_view2); if (hr == E_NOINTERFACE) { win_skip("IShellView2 not supported\n"); goto cleanup; } ok(SUCCEEDED(hr), "QueryInterface returned %#x\n", hr); if (FAILED(hr)) goto cleanup; hr = IShellView2_DestroyViewWindow(shell_view2); ok(SUCCEEDED(hr), "DestroyViewWindow returned %#x\n", hr); folder_settings.ViewMode = FVM_LIST; folder_settings.fFlags = 0; view_params.cbSize = sizeof(view_params); view_params.psvPrev = NULL; view_params.pfs = &folder_settings; view_params.psbOwner = shell_browser; view_params.prcView = ▭ view_params.pvid = NULL; view_params.hwndView = NULL; hr = IShellView2_CreateViewWindow2(shell_view2, &view_params); if (hr == E_FAIL) { win_skip("CreateViewWindow2 is broken on Vista/W2K8\n"); goto cleanup; } ok(SUCCEEDED(hr), "CreateViewWindow2 returned %#x\n", hr); if (FAILED(hr)) goto cleanup; hr = IShellView2_GetCurrentInfo(shell_view2, &folder_settings); ok(SUCCEEDED(hr), "GetCurrentInfo returned %#x\n", hr); ok(folder_settings.ViewMode == FVM_LIST, "view mode is %d, expected FVM_LIST\n", folder_settings.ViewMode); hr = IShellView2_DestroyViewWindow(shell_view2); ok(SUCCEEDED(hr), "DestroyViewWindow returned %#x\n", hr); /* XP and W2K3 need this. On Win9x and W2K the call to DestroyWindow() fails and has * no side effects. NT4 doesn't get here. (FIXME: Vista doesn't get here yet). */ DestroyWindow(view_params.hwndView); view_params.pvid = &VID_Details; hr = IShellView2_CreateViewWindow2(shell_view2, &view_params); ok(SUCCEEDED(hr), "CreateViewWindow2 returned %#x\n", hr); if (FAILED(hr)) goto cleanup; hr = IShellView2_GetCurrentInfo(shell_view2, &folder_settings); ok(SUCCEEDED(hr), "GetCurrentInfo returned %#x\n", hr); ok(folder_settings.ViewMode == FVM_DETAILS || broken(folder_settings.ViewMode == FVM_LIST), /* Win9x */ "view mode is %d, expected FVM_DETAILS\n", folder_settings.ViewMode); cleanup: if (shell_view2) IShellView2_Release(shell_view2); if (shell_view) IShellView_Release(shell_view); PostMessage(GetParent(dlg), WM_COMMAND, IDCANCEL, 0); } } return 0; }
/************************************************************************** * DoCopyOrCut * * copies the currently selected items into the clipboard */ static BOOL DoCopyOrCut( IContextMenu *iface, HWND hwnd, BOOL bCut) { ICOM_THIS(ItemCmImpl, iface); LPSHELLBROWSER lpSB; LPSHELLVIEW lpSV; LPDATAOBJECT lpDo; TRACE("(%p)->(wnd=0x%04x,bCut=0x%08x)\n",This, hwnd, bCut); if(GetShellOle()) { /* get the active IShellView */ if ((lpSB = (LPSHELLBROWSER)SendMessageA(hwnd, CWM_GETISHELLBROWSER,0,0))) { if (SUCCEEDED(IShellBrowser_QueryActiveShellView(lpSB, &lpSV))) { if (SUCCEEDED(IShellView_GetItemObject(lpSV, SVGIO_SELECTION, &IID_IDataObject, (LPVOID*)&lpDo))) { pOleSetClipboard(lpDo); IDataObject_Release(lpDo); } IShellView_Release(lpSV); } } } return TRUE; #if 0 /* the following code does the copy operation witout ole32.dll we might need this possibility too (js) */ BOOL bSuccess = FALSE; TRACE("(%p)\n", iface); if(OpenClipboard(NULL)) { if(EmptyClipboard()) { IPersistFolder2 * ppf2; IShellFolder_QueryInterface(This->pSFParent, &IID_IPersistFolder2, (LPVOID*)&ppf2); if (ppf2) { LPITEMIDLIST pidl; IPersistFolder2_GetCurFolder(ppf2, &pidl); if(pidl) { HGLOBAL hMem; hMem = RenderHDROP(pidl, This->apidl, This->cidl); if(SetClipboardData(CF_HDROP, hMem)) { bSuccess = TRUE; } SHFree(pidl); } IPersistFolder2_Release(ppf2); } } CloseClipboard(); } return bSuccess; #endif }
static void test_ShellWindows(void) { IShellWindows *shellwindows; LONG cookie, cookie2, ret; IDispatch *disp; VARIANT v, v2; HRESULT hr; HWND hwnd; hr = CoCreateInstance(&CLSID_ShellWindows, NULL, CLSCTX_LOCAL_SERVER, &IID_IShellWindows, (void**)&shellwindows); ok(hr == S_OK, "got 0x%08x\n", hr); /* TODO: remove when explorer startup with clean prefix is fixed */ if (hr != S_OK) return; if (0) { /* NULL out argument - currently crashes on Wine */ hr = IShellWindows_Register(shellwindows, NULL, 0, SWC_EXPLORER, NULL); ok(hr == HRESULT_FROM_WIN32(RPC_X_NULL_REF_POINTER), "got 0x%08x\n", hr); } hr = IShellWindows_Register(shellwindows, NULL, 0, SWC_EXPLORER, &cookie); todo_wine ok(hr == E_POINTER, "got 0x%08x\n", hr); hr = IShellWindows_Register(shellwindows, (IDispatch*)shellwindows, 0, SWC_EXPLORER, &cookie); todo_wine ok(hr == E_POINTER, "got 0x%08x\n", hr); hr = IShellWindows_Register(shellwindows, (IDispatch*)shellwindows, 0, SWC_EXPLORER, &cookie); todo_wine ok(hr == E_POINTER, "got 0x%08x\n", hr); hwnd = CreateWindowExA(0, "button", "test", BS_CHECKBOX | WS_VISIBLE | WS_POPUP, 0, 0, 50, 14, 0, 0, 0, NULL); ok(hwnd != NULL, "got %p, error %d\n", hwnd, GetLastError()); cookie = 0; hr = IShellWindows_Register(shellwindows, NULL, HandleToLong(hwnd), SWC_EXPLORER, &cookie); todo_wine { ok(hr == S_OK, "got 0x%08x\n", hr); ok(cookie != 0, "got %d\n", cookie); } cookie2 = 0; hr = IShellWindows_Register(shellwindows, NULL, HandleToLong(hwnd), SWC_EXPLORER, &cookie2); todo_wine { ok(hr == S_OK, "got 0x%08x\n", hr); ok(cookie2 != 0 && cookie2 != cookie, "got %d\n", cookie2); } hr = IShellWindows_Revoke(shellwindows, cookie); todo_wine ok(hr == S_OK, "got 0x%08x\n", hr); hr = IShellWindows_Revoke(shellwindows, cookie2); todo_wine ok(hr == S_OK, "got 0x%08x\n", hr); hr = IShellWindows_Revoke(shellwindows, 0); todo_wine ok(hr == S_FALSE, "got 0x%08x\n", hr); /* we can register ourselves as desktop, but FindWindowSW still returns real desktop window */ cookie = 0; hr = IShellWindows_Register(shellwindows, NULL, HandleToLong(hwnd), SWC_DESKTOP, &cookie); todo_wine { ok(hr == S_OK, "got 0x%08x\n", hr); ok(cookie != 0, "got %d\n", cookie); } disp = (void*)0xdeadbeef; ret = 0xdead; VariantInit(&v); hr = IShellWindows_FindWindowSW(shellwindows, &v, &v, SWC_DESKTOP, &ret, SWFO_NEEDDISPATCH, &disp); ok(hr == S_OK || broken(hr == S_FALSE), "got 0x%08x\n", hr); if (hr == S_FALSE) { /* winxp and earlier */ win_skip("SWC_DESKTOP is not supported, some tests will be skipped.\n"); /* older versions allowed to regiser SWC_DESKTOP and access it with FindWindowSW */ ok(disp == NULL, "got %p\n", disp); ok(ret == 0, "got %d\n", ret); } else { static const IID *browser_riids[] = { &IID_IWebBrowser2, &IID_NULL }; static const IID *viewdual_riids[] = { &IID_IShellFolderViewDual3, &IID_NULL }; IShellFolderViewDual *view; IShellBrowser *sb, *sb2; IServiceProvider *sp; IDispatch *doc, *app; IWebBrowser2 *wb; IShellView *sv; IUnknown *unk; ok(disp != NULL, "got %p\n", disp); ok(ret != HandleToUlong(hwnd), "got %d\n", ret); /* IDispatch-related tests */ test_dispatch_typeinfo(disp, browser_riids); /* IWebBrowser2 */ hr = IDispatch_QueryInterface(disp, &IID_IWebBrowser2, (void**)&wb); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IWebBrowser2_Refresh(wb); todo_wine ok(hr == S_OK, "got 0x%08x\n", hr); hr = IWebBrowser2_get_Application(wb, &app); ok(hr == S_OK, "got 0x%08x\n", hr); ok(disp == app, "got %p, %p\n", app, disp); IDispatch_Release(app); hr = IWebBrowser2_get_Document(wb, &doc); todo_wine ok(hr == S_OK, "got 0x%08x\n", hr); if (hr == S_OK) test_dispatch_typeinfo(doc, viewdual_riids); IWebBrowser2_Release(wb); /* IServiceProvider */ hr = IDispatch_QueryInterface(disp, &IID_IShellFolderViewDual, (void**)&view); ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); hr = IDispatch_QueryInterface(disp, &IID_IServiceProvider, (void**)&sp); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IServiceProvider_QueryService(sp, &SID_STopLevelBrowser, &IID_IShellBrowser, (void**)&sb); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IServiceProvider_QueryService(sp, &SID_STopLevelBrowser, &IID_IShellBrowser, (void**)&sb2); ok(hr == S_OK, "got 0x%08x\n", hr); ok(sb == sb2, "got %p, %p\n", sb, sb2); hr = IServiceProvider_QueryService(sp, &SID_STopLevelBrowser, &IID_IOleWindow, (void**)&unk); ok(hr == S_OK, "got 0x%08x\n", hr); IUnknown_Release(unk); hr = IServiceProvider_QueryService(sp, &SID_STopLevelBrowser, &IID_IExplorerBrowser, (void**)&unk); ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); hr = IShellBrowser_QueryInterface(sb, &IID_IExplorerBrowser, (void**)&unk); ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); hr = IShellBrowser_QueryInterface(sb, &IID_IWebBrowser2, (void**)&unk); ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); hr = IShellBrowser_QueryInterface(sb, &IID_IDispatch, (void**)&unk); ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); hr = IShellBrowser_QueryActiveShellView(sb, &sv); ok(hr == S_OK, "got 0x%08x\n", hr); IShellView_Release(sv); IShellBrowser_Release(sb2); IShellBrowser_Release(sb); hr = IServiceProvider_QueryService(sp, &SID_STopLevelBrowser, &IID_IUnknown, (void**)&unk); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IUnknown_QueryInterface(unk, &IID_IShellBrowser, (void**)&sb2); ok(hr == S_OK, "got 0x%08x\n", hr); IShellBrowser_Release(sb2); IUnknown_Release(unk); hr = IServiceProvider_QueryService(sp, &SID_STopLevelBrowser, &IID_IShellView, (void**)&sv); ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); IServiceProvider_Release(sp); IDispatch_Release(disp); } disp = (void*)0xdeadbeef; ret = 0xdead; VariantInit(&v); hr = IShellWindows_FindWindowSW(shellwindows, &v, &v, SWC_DESKTOP, &ret, 0, &disp); ok(hr == S_OK || broken(hr == S_FALSE) /* winxp */, "got 0x%08x\n", hr); ok(disp == NULL, "got %p\n", disp); ok(ret != HandleToUlong(hwnd), "got %d\n", ret); disp = (void*)0xdeadbeef; ret = 0xdead; V_VT(&v) = VT_I4; V_I4(&v) = cookie; VariantInit(&v2); hr = IShellWindows_FindWindowSW(shellwindows, &v, &v2, SWC_BROWSER, &ret, SWFO_COOKIEPASSED, &disp); todo_wine ok(hr == S_FALSE, "got 0x%08x\n", hr); ok(disp == NULL, "got %p\n", disp); ok(ret == 0, "got %d\n", ret); hr = IShellWindows_Revoke(shellwindows, cookie); todo_wine ok(hr == S_OK, "got 0x%08x\n", hr); DestroyWindow(hwnd); IShellWindows_Release(shellwindows); }
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; }
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; }