void ReportSelectedItems(IUnknown *punkSite, IShellItemArray *psia) { DWORD cItems; HRESULT hr = psia->GetCount(&cItems); for (DWORD i = 0; SUCCEEDED(hr) && (i < cItems); i++) { IShellItem *psi; hr = psia->GetItemAt(i, &psi); if (SUCCEEDED(hr)) { PWSTR pszName; hr = GetIDListName(psi, &pszName); if (SUCCEEDED(hr)) { HWND hwnd; IUnknown_GetWindow(punkSite, &hwnd); int nButton; const TASKDIALOG_COMMON_BUTTON_FLAGS buttonFlags = (i == (cItems - 1)) ? TDCBF_OK_BUTTON : TDCBF_OK_BUTTON | TDCBF_CANCEL_BUTTON; WCHAR szMsg[128]; StringCchPrintf(szMsg, ARRAYSIZE(szMsg), L"Item %d of %d added to basket", i + 1, cItems); if (SUCCEEDED(TaskDialog(hwnd, 0, L"Items Addded to Basket", szMsg, pszName, buttonFlags, NULL, &nButton))) { hr = (nButton == IDCANCEL) ? HRESULT_FROM_WIN32(ERROR_CANCELLED) : S_OK; } CoTaskMemFree(pszName); } psi->Release(); } } }
virtual HRESULT STDMETHODCALLTYPE SetSite(IUnknown *pUnkSite) { HRESULT hRet; HWND hwndSite; TRACE("ITaskBand::SetSite(0x%p)\n", pUnkSite); hRet = IUnknown_GetWindow(pUnkSite, &hwndSite); if (FAILED(hRet)) { TRACE("Querying site window failed: 0x%x\n", hRet); return hRet; } TRACE("CreateTaskSwitchWnd(Parent: 0x%p)\n", hwndSite); HWND hwndTaskSwitch = CreateTaskSwitchWnd(hwndSite, m_Tray); if (!hwndTaskSwitch) { ERR("CreateTaskSwitchWnd failed"); return E_FAIL; } m_Site = pUnkSite; m_hWnd = hwndTaskSwitch; return S_OK; }
HRESULT STDMETHODCALLTYPE CAddressEditBox::ParseNow(long paramC) { ULONG eaten; ULONG attributes; HRESULT hr; HWND topLevelWindow; CComPtr<IShellBrowser> pisb; hr = IUnknown_QueryService(fSite, SID_SShellBrowser, IID_PPV_ARG(IShellBrowser, &pisb)); if (FAILED_UNEXPECTEDLY(hr)) return hr; hr = IUnknown_GetWindow(pisb, &topLevelWindow); if (FAILED_UNEXPECTEDLY(hr)) return hr; LPWSTR input; int inputLength = fCombobox.GetWindowTextLength() + 2; input = new WCHAR[inputLength]; fCombobox.GetWindowText(input, inputLength); LPWSTR address; int addressLength = ExpandEnvironmentStrings(input, NULL, 0); if (addressLength <= 0) { address = input; } else { addressLength += 2; address = new WCHAR[addressLength]; if (!ExpandEnvironmentStrings(input, address, addressLength)) { delete[] address; address = input; } } CComPtr<IShellFolder> psfDesktop; hr = SHGetDesktopFolder(&psfDesktop); if (SUCCEEDED(hr)) { hr = psfDesktop->ParseDisplayName(topLevelWindow, NULL, address, &eaten, &pidlLastParsed, &attributes); } if (address != input) delete [] address; delete [] input; return hr; }
HRESULT STDMETHODCALLTYPE CAddressBand::SetSite(IUnknown *pUnkSite) { CComPtr<IShellService> shellService; HWND parentWindow; HWND combobox; HRESULT hResult; IImageList *piml; if (pUnkSite == NULL) { fSite.Release(); return S_OK; } fSite.Release(); hResult = pUnkSite->QueryInterface(IID_PPV_ARG(IDockingWindowSite, &fSite)); if (FAILED_UNEXPECTEDLY(hResult)) return hResult; // get window handle of parent parentWindow = NULL; hResult = IUnknown_GetWindow(fSite, &parentWindow); if (!::IsWindow(parentWindow)) return E_FAIL; // create combo box ex combobox = CreateWindowEx(WS_EX_TOOLWINDOW, WC_COMBOBOXEXW, NULL, WS_CHILD | WS_VISIBLE | WS_CLIPCHILDREN | WS_TABSTOP | CCS_NODIVIDER | CCS_NOMOVEY | CBS_OWNERDRAWFIXED, 0, 0, 500, 250, parentWindow, (HMENU)IDM_TOOLBARS_ADDRESSBAR, _AtlBaseModule.GetModuleInstance(), 0); if (combobox == NULL) return E_FAIL; SubclassWindow(combobox); HRESULT hr = SHGetImageList(SHIL_SMALL, IID_PPV_ARG(IImageList, &piml)); if (FAILED_UNEXPECTEDLY(hr)) { SendMessageW(combobox, CBEM_SETIMAGELIST, 0, 0); } else { SendMessageW(combobox, CBEM_SETIMAGELIST, 0, reinterpret_cast<LPARAM>(piml)); } SendMessage(CBEM_SETEXTENDEDSTYLE, CBES_EX_CASESENSITIVE | CBES_EX_NOSIZELIMIT, CBES_EX_CASESENSITIVE | CBES_EX_NOSIZELIMIT); fEditControl = reinterpret_cast<HWND>(SendMessage(CBEM_GETEDITCONTROL, 0, 0)); fComboBox = reinterpret_cast<HWND>(SendMessage(CBEM_GETCOMBOCONTROL, 0, 0)); hResult = CAddressEditBox_CreateInstance(IID_PPV_ARG(IAddressEditBox, &fAddressEditBox)); if (FAILED_UNEXPECTEDLY(hResult)) return hResult; hResult = fAddressEditBox->QueryInterface(IID_PPV_ARG(IShellService, &shellService)); if (FAILED_UNEXPECTEDLY(hResult)) return hResult; hResult = fAddressEditBox->Init(combobox, fEditControl, 8, fSite /*(IAddressBand *)this*/); if (FAILED_UNEXPECTEDLY(hResult)) return hResult; hResult = shellService->SetOwner(fSite); if (FAILED_UNEXPECTEDLY(hResult)) return hResult; fGoButtonShown = SHRegGetBoolUSValueW(L"Software\\Microsoft\\Internet Explorer\\Main", L"ShowGoButton", FALSE, TRUE); if (fGoButtonShown) CreateGoButton(); return hResult; }
HRESULT STDMETHODCALLTYPE CAddressEditBox::Execute(long paramC) { HRESULT hr; /* * Parse the path is it wasn't parsed */ if (!pidlLastParsed) ParseNow(0); if (!pidlLastParsed) return E_FAIL; /* * Get the IShellBrowser and IBrowserService interfaces of the shell browser */ CComPtr<IShellBrowser> pisb; hr = IUnknown_QueryService(fSite, SID_SShellBrowser, IID_PPV_ARG(IShellBrowser, &pisb)); if (FAILED(hr)) return hr; CComPtr<IBrowserService> pbs; pisb->QueryInterface(IID_PPV_ARG(IBrowserService, &pbs)); if (FAILED(hr)) return hr; /* * Get the current pidl of the shellbrowser and check if it is the same with the parsed one */ PIDLIST_ABSOLUTE pidl; hr = pbs->GetPidl(&pidl); if (FAILED(hr)) return hr; CComPtr<IShellFolder> psf; hr = SHGetDesktopFolder(&psf); if (FAILED(hr)) return hr; hr = psf->CompareIDs(0, pidl, pidlLastParsed); SHFree(pidl); if (hr == 0) return S_OK; /* * Attempt to browse to the parsed pidl */ hr = pisb->BrowseObject(pidlLastParsed, 0); if (SUCCEEDED(hr)) return hr; /* * Browsing to the pidl failed so it's not a folder. So invoke its defaule command. */ HWND topLevelWindow; hr = IUnknown_GetWindow(pisb, &topLevelWindow); if (FAILED(hr)) return hr; LPCITEMIDLIST pidlChild; CComPtr<IShellFolder> sf; hr = SHBindToParent(pidlLastParsed, IID_PPV_ARG(IShellFolder, &sf), &pidlChild); if (FAILED(hr)) return hr; hr = SHInvokeDefaultCommand(topLevelWindow, sf, pidlChild); if (FAILED(hr)) return hr; return hr; }
HRESULT STDMETHODCALLTYPE CAddressEditBox::ParseNow(long paramC) { ULONG eaten; ULONG attributes; HRESULT hr; HWND topLevelWindow; PIDLIST_ABSOLUTE pidlCurrent= NULL; PIDLIST_RELATIVE pidlRelative = NULL; CComPtr<IShellFolder> psfCurrent; CComPtr<IBrowserService> pbs; hr = IUnknown_QueryService(fSite, SID_SShellBrowser, IID_PPV_ARG(IBrowserService, &pbs)); if (FAILED_UNEXPECTEDLY(hr)) return hr; hr = IUnknown_GetWindow(pbs, &topLevelWindow); if (FAILED_UNEXPECTEDLY(hr)) return hr; /* Get the path to browse and expand it if needed */ LPWSTR input; int inputLength = fCombobox.GetWindowTextLength() + 2; input = new WCHAR[inputLength]; fCombobox.GetWindowText(input, inputLength); LPWSTR address; int addressLength = ExpandEnvironmentStrings(input, NULL, 0); if (addressLength <= 0) { address = input; } else { addressLength += 2; address = new WCHAR[addressLength]; if (!ExpandEnvironmentStrings(input, address, addressLength)) { delete[] address; address = input; } } /* Try to parse a relative path and if it fails, try to browse an absolute path */ CComPtr<IShellFolder> psfDesktop; hr = SHGetDesktopFolder(&psfDesktop); if (FAILED_UNEXPECTEDLY(hr)) goto cleanup; hr = pbs->GetPidl(&pidlCurrent); if (FAILED_UNEXPECTEDLY(hr)) goto cleanup; hr = psfDesktop->BindToObject(pidlCurrent, NULL, IID_PPV_ARG(IShellFolder, &psfCurrent)); if (FAILED_UNEXPECTEDLY(hr)) goto cleanup; hr = psfCurrent->ParseDisplayName(topLevelWindow, NULL, address, &eaten, &pidlRelative, &attributes); if (SUCCEEDED(hr)) { pidlLastParsed = ILCombine(pidlCurrent, pidlRelative); ILFree(pidlRelative); goto cleanup; } /* We couldn't parse a relative path, attempt to parse an absolute path */ hr = psfDesktop->ParseDisplayName(topLevelWindow, NULL, address, &eaten, &pidlLastParsed, &attributes); cleanup: if (pidlCurrent) ILFree(pidlCurrent); if (address != input) delete [] address; delete [] input; return hr; }