static void test_GetItemObject(void) { IShellFolder *desktop; IShellView *view; IUnknown *unk; HRESULT hr; hr = SHGetDesktopFolder(&desktop); ok(hr == S_OK, "got (0x%08x)\n", hr); hr = IShellFolder_CreateViewObject(desktop, NULL, &IID_IShellView, (void**)&view); ok(hr == S_OK, "got (0x%08x)\n", hr); /* from documentation three interfaces are supported for SVGIO_BACKGROUND: IContextMenu, IDispatch, IPersistHistory */ hr = IShellView_GetItemObject(view, SVGIO_BACKGROUND, &IID_IContextMenu, (void**)&unk); ok(hr == S_OK, "got (0x%08x)\n", hr); IUnknown_Release(unk); unk = NULL; hr = IShellView_GetItemObject(view, SVGIO_BACKGROUND, &IID_IDispatch, (void**)&unk); todo_wine ok(hr == S_OK || broken(hr == E_NOTIMPL) /* NT4 */, "got (0x%08x)\n", hr); if (unk) IUnknown_Release(unk); unk = NULL; hr = IShellView_GetItemObject(view, SVGIO_BACKGROUND, &IID_IPersistHistory, (void**)&unk); todo_wine ok(hr == S_OK || broken(hr == E_NOTIMPL) /* W9x, NT4 */, "got (0x%08x)\n", hr); if (unk) IUnknown_Release(unk); /* example of unsupported interface, base for IPersistHistory */ hr = IShellView_GetItemObject(view, SVGIO_BACKGROUND, &IID_IPersist, (void**)&unk); ok(hr == E_NOINTERFACE || broken(hr == E_NOTIMPL) /* W2K */, "got (0x%08x)\n", hr); IShellView_Release(view); IShellFolder_Release(desktop); }
/************************************************************************** * IShellBrowserImpl_OnSelChange */ static HRESULT IShellBrowserImpl_OnSelChange(IShellBrowserImpl *This, const IShellView *ppshv) { FileOpenDlgInfos *fodInfos; fodInfos = get_filedlg_infoptr(This->hwndOwner); TRACE("(%p do=%p view=%p)\n", This, fodInfos->Shell.FOIDataObject, fodInfos->Shell.FOIShellView); /* release old selections */ if (fodInfos->Shell.FOIDataObject) IDataObject_Release(fodInfos->Shell.FOIDataObject); /* get a new DataObject from the ShellView */ if(FAILED(IShellView_GetItemObject(fodInfos->Shell.FOIShellView, SVGIO_SELECTION, &IID_IDataObject, (void**)&fodInfos->Shell.FOIDataObject))) return E_FAIL; FILEDLG95_FILENAME_FillFromSelection(This->hwndOwner); if(fodInfos->ofnInfos->Flags & OFN_EXPLORER) SendCustomDlgNotificationMessage(This->hwndOwner, CDN_SELCHANGE); return S_OK; }
/************************************************************************** * 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; }
/************************************************************************** * IShellBrowserImpl_ICommDlgBrowser_OnSelChange */ static HRESULT IShellBrowserImpl_ICommDlgBrowser_OnSelChange(ICommDlgBrowser *iface, IShellView *ppshv) { FileOpenDlgInfos *fodInfos; IShellBrowserImpl *This = impl_from_ICommDlgBrowser(iface); fodInfos = (FileOpenDlgInfos *) GetPropA(This->hwndOwner,FileOpenDlgInfosStr); TRACE("(%p do=%p view=%p)\n", This, fodInfos->Shell.FOIDataObject, fodInfos->Shell.FOIShellView); /* release old selections */ if (fodInfos->Shell.FOIDataObject) IDataObject_Release(fodInfos->Shell.FOIDataObject); /* get a new DataObject from the ShellView */ if(FAILED(IShellView_GetItemObject(fodInfos->Shell.FOIShellView, SVGIO_SELECTION, &IID_IDataObject, (LPVOID*)&fodInfos->Shell.FOIDataObject))) return E_FAIL; FILEDLG95_FILENAME_FillFromSelection(This->hwndOwner); SendCustomDlgNotificationMessage(This->hwndOwner, CDN_SELCHANGE); return S_OK; }
/************************************************************************** * 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_ShellFolderViewDual(void) { static const IID *shelldisp_riids[] = { &IID_IShellDispatch6, &IID_IShellDispatch5, &IID_IShellDispatch4, &IID_NULL }; IShellFolderViewDual *viewdual; IShellFolder *desktop, *tmpdir; IShellView *view, *view2; IDispatch *disp, *disp2; WCHAR pathW[MAX_PATH]; LPITEMIDLIST pidl; HRESULT hr; /* IShellFolderViewDual is not an IShellView extension */ hr = SHGetDesktopFolder(&desktop); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IShellFolder_CreateViewObject(desktop, NULL, &IID_IShellView, (void**)&view); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IShellView_QueryInterface(view, &IID_IShellFolderViewDual, (void**)&viewdual); ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); hr = IShellView_GetItemObject(view, SVGIO_BACKGROUND, &IID_IDispatch, (void**)&disp); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IShellView_GetItemObject(view, SVGIO_BACKGROUND, &IID_IDispatch, (void**)&disp2); ok(hr == S_OK, "got 0x%08x\n", hr); ok(disp2 == disp, "got %p, %p\n", disp2, disp); IDispatch_Release(disp2); hr = IDispatch_QueryInterface(disp, &IID_IShellFolderViewDual, (void**)&viewdual); ok(hr == S_OK, "got 0x%08x\n", hr); ok(disp == (IDispatch*)viewdual, "got %p, expected %p\n", viewdual, disp); hr = IShellFolderViewDual_QueryInterface(viewdual, &IID_IShellView, (void**)&view2); ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); /* get_Application() */ if (0) { /* crashes on pre-vista */ hr = IShellFolderViewDual_get_Application(viewdual, NULL); ok(hr == E_INVALIDARG, "got 0x%08x\n", hr); } hr = IShellFolderViewDual_get_Application(viewdual, &disp2); ok(hr == S_OK, "got 0x%08x\n", hr); ok(disp2 != (IDispatch*)viewdual, "got %p, %p\n", disp2, viewdual); test_dispatch_typeinfo(disp2, shelldisp_riids); IDispatch_Release(disp2); IShellFolderViewDual_Release(viewdual); IDispatch_Release(disp); disp = (void*)0xdeadbeef; hr = IShellView_GetItemObject(view, SVGIO_BACKGROUND, &IID_IShellFolderViewDual, (void**)&disp); ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); ok(disp == NULL, "got %p\n", disp); IShellView_Release(view); /* Try with some other folder, that's not a desktop */ GetTempPathW(sizeof(pathW)/sizeof(pathW[0]), pathW); hr = IShellFolder_ParseDisplayName(desktop, NULL, NULL, pathW, NULL, &pidl, NULL); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IShellFolder_BindToObject(desktop, pidl, NULL, &IID_IShellFolder, (void**)&tmpdir); ok(hr == S_OK, "got 0x%08x\n", hr); CoTaskMemFree(pidl); hr = IShellFolder_CreateViewObject(desktop, NULL, &IID_IShellView, (void**)&view); ok(hr == S_OK, "got 0x%08x\n", hr); hr = IShellView_QueryInterface(view, &IID_IShellFolderViewDual, (void**)&viewdual); ok(hr == E_NOINTERFACE, "got 0x%08x\n", hr); hr = IShellView_GetItemObject(view, SVGIO_BACKGROUND, &IID_IDispatch, (void**)&disp); ok(hr == S_OK, "got 0x%08x\n", hr); IDispatch_Release(disp); IShellView_Release(view); IShellFolder_Release(tmpdir); IShellFolder_Release(desktop); }