HRESULT CDeskBand::GetIServiceProvider(HWND hwnd, IServiceProvider ** pServiceProvider) { HRESULT hr = E_FAIL; if (m_pSite) hr = m_pSite->QueryInterface(IID_IServiceProvider, (LPVOID*)pServiceProvider); else { // we don't have a site, so we try finding the explorer window by enumerating // all explorer instances and compare that to the parent of hwnd. IShellWindows *psw; if (SUCCEEDED(CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL, IID_IShellWindows, (LPVOID*)&psw))) { VARIANT v; V_VT(&v) = VT_I4; IDispatch *pdisp; BOOL fFound = FALSE; long count = -1; if (SUCCEEDED(psw->get_Count(&count))) { for (V_I4(&v) = 0; !fFound && (V_I4(&v) < count) && SUCCEEDED(psw->Item(v, &pdisp)); V_I4(&v)++) { if (pdisp) { IWebBrowserApp *pwba; if (SUCCEEDED(pdisp->QueryInterface(IID_IWebBrowserApp, (LPVOID*)&pwba))) { HWND hwndWBA; if (SUCCEEDED(pwba->get_HWND((LONG_PTR*)&hwndWBA))) { if ((hwndWBA == hwnd)||(hwndWBA == ::GetParent(hwnd))) { fFound = TRUE; hr = pwba->QueryInterface(IID_IServiceProvider, (void**)pServiceProvider); } } pwba->Release(); } pdisp->Release(); } } } psw->Release(); } } return hr; }