ReactOS 0.4.16-dev-979-g79f281e
winlist.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS shdocvw
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: CLSID_ShellWindows and WinList_* functions
5 * COPYRIGHT: Copyright 2025 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 */
7
8#include "objects.h"
9
10#include <wine/debug.h>
12
14
15static HRESULT
17 _Out_ LPVARIANTARG pvarg,
18 _In_ LPCVOID pv,
20{
21 VariantInit(pvarg);
22
24 if (!pArray)
25 {
26 ERR("!pArray\n");
27 return E_OUTOFMEMORY;
28 }
29
30 V_ARRAY(pvarg) = pArray;
31 V_VT(pvarg) = VT_ARRAY | VT_UI1;
32 CopyMemory(pArray->pvData, pv, cb);
33 return S_OK;
34}
35
36static HRESULT
38 _Out_ LPVARIANTARG pvarg,
40{
41 return InitVariantFromBuffer(pvarg, pidl, ILGetSize(pidl));
42}
43
44static HRESULT
46{
47 switch (V_VT(pvarg))
48 {
49 case VT_EMPTY:
50 case VT_BOOL:
51 case VT_I4:
52 case VT_UI4:
53 break;
54 case VT_UNKNOWN:
55 if (V_UNKNOWN(pvarg))
56 V_UNKNOWN(pvarg)->Release();
57 break;
58 case VT_DISPATCH:
59 if (V_DISPATCH(pvarg))
60 V_DISPATCH(pvarg)->Release();
61 break;
62 case VT_SAFEARRAY:
64 break;
65 default:
66 return VariantClear(pvarg);
67 }
68 V_VT(pvarg) = VT_EMPTY;
69 return S_OK;
70}
71
72/*************************************************************************
73 * WinList_Init (SHDOCVW.110)
74 *
75 * Retired in NT 6.1.
76 */
80{
81 FIXME("()\n");
82 return FALSE;
83}
84
85/*************************************************************************
86 * WinList_Terminate (SHDOCVW.111)
87 *
88 * NT 4.71 and higher. Retired in NT 6.1.
89 */
93{
94 FIXME("()\n");
95}
96
97/*************************************************************************
98 * WinList_GetShellWindows (SHDOCVW.179)
99 *
100 * NT 5.0 and higher.
101 * @see https://learn.microsoft.com/en-us/windows/win32/api/exdisp/nn-exdisp-ishellwindows
102 */
104IShellWindows* WINAPI
107{
108 FIXME("(%d)\n", bCreate);
109 return NULL;
110}
111
112/*************************************************************************
113 * WinList_NotifyNewLocation (SHDOCVW.177)
114 *
115 * NT 5.0 and higher.
116 * @see https://learn.microsoft.com/en-us/windows/win32/api/exdisp/nf-exdisp-ishellwindows-onnavigate
117 */
121 _In_ IShellWindows *pShellWindows,
122 _In_ LONG lCookie,
123 _In_ LPCITEMIDLIST pidl)
124{
125 TRACE("(%p, %ld, %p)\n", pShellWindows, lCookie, pidl);
126
127 if (!pidl)
128 {
129 ERR("!pidl\n");
130 return E_UNEXPECTED;
131 }
132
133 VARIANTARG varg;
134 HRESULT hr = InitVariantFromIDList(&varg, pidl);
136 return hr;
137
138 hr = pShellWindows->OnNavigate(lCookie, &varg);
139 VariantClearLazy(&varg);
140 return hr;
141}
142
143/*************************************************************************
144 * WinList_FindFolderWindow (SHDOCVW.178)
145 *
146 * NT 5.0 and higher.
147 * @see https://learn.microsoft.com/en-us/windows/win32/api/exdisp/nf-exdisp-ishellwindows-findwindowsw
148 */
152 _In_ LPCITEMIDLIST pidl,
153 _In_ DWORD dwUnused,
154 _Out_opt_ PLONG phwnd, // Stores a window handle but LONG type
155 _Out_opt_ IWebBrowserApp **ppWebBrowserApp)
156{
157 UNREFERENCED_PARAMETER(dwUnused);
158
159 TRACE("(%p, %ld, %p, %p)\n", pidl, dwUnused, phwnd, ppWebBrowserApp);
160
161 if (ppWebBrowserApp)
162 *ppWebBrowserApp = NULL;
163
164 if (phwnd)
165 *phwnd = 0;
166
167 if (!pidl)
168 {
169 ERR("!pidl\n");
170 return E_UNEXPECTED;
171 }
172
173 CComPtr<IShellWindows> pShellWindows(WinList_GetShellWindows(ppWebBrowserApp != NULL));
174 if (!pShellWindows)
175 {
176 ERR("!pShellWindows\n");
177 return E_UNEXPECTED;
178 }
179
180 VARIANTARG varg;
181 HRESULT hr = InitVariantFromIDList(&varg, pidl);
183 return hr;
184
185 CComPtr<IDispatch> pDispatch;
186 const INT options = SWFO_INCLUDEPENDING | (ppWebBrowserApp ? SWFO_NEEDDISPATCH : 0);
187 hr = pShellWindows->FindWindowSW(&varg, &s_vaEmpty, SWC_BROWSER, phwnd, options, &pDispatch);
188 if (pDispatch && ppWebBrowserApp)
189 hr = pDispatch->QueryInterface(IID_PPV_ARG(IWebBrowserApp, ppWebBrowserApp));
190
191 VariantClearLazy(&varg);
192 return hr;
193}
194
195/*************************************************************************
196 * WinList_RegisterPending (SHDOCVW.180)
197 *
198 * NT 5.0 and higher.
199 * @see https://learn.microsoft.com/en-us/windows/win32/api/exdisp/nf-exdisp-ishellwindows-registerpending
200 */
205 _In_ LPCITEMIDLIST pidl,
206 _In_ DWORD dwUnused,
207 _Out_ PLONG plCookie)
208{
209 TRACE("(%ld, %p, %ld, %p)\n", dwThreadId, pidl, dwUnused, plCookie);
210
211 if (!pidl)
212 {
213 ERR("!pidl\n");
214 return E_UNEXPECTED;
215 }
216
217 CComPtr<IShellWindows> pShellWindows(WinList_GetShellWindows(FALSE));
218 if (!pShellWindows)
219 {
220 ERR("!pShellWindows\n");
221 return E_UNEXPECTED;
222 }
223
224 VARIANTARG varg;
225 HRESULT hr = InitVariantFromIDList(&varg, pidl);
227 return hr;
228
229 hr = pShellWindows->RegisterPending(dwThreadId, &varg, &s_vaEmpty, SWC_BROWSER, plCookie);
230 VariantClearLazy(&varg);
231 return hr;
232}
233
234/*************************************************************************
235 * WinList_Revoke (SHDOCVW.181)
236 *
237 * NT 5.0 and higher.
238 * @see https://learn.microsoft.com/en-us/windows/win32/api/exdisp/nf-exdisp-ishellwindows-revoke
239 */
243 _In_ LONG lCookie)
244{
245 TRACE("(%ld)\n", lCookie);
246
247 CComPtr<IShellWindows> pShellWindows(WinList_GetShellWindows(TRUE));
248 if (!pShellWindows)
249 {
250 ERR("!pShellWindows\n");
251 return E_FAIL;
252 }
253
254 return pShellWindows->Revoke(lCookie);
255}
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define FIXME(fmt,...)
Definition: precomp.h:53
#define ERR(fmt,...)
Definition: precomp.h:57
#define EXTERN_C
Definition: basetyps.h:12
#define E_OUTOFMEMORY
Definition: ddrawi.h:100
#define E_FAIL
Definition: ddrawi.h:102
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
@ VT_UNKNOWN
Definition: compat.h:2308
@ VT_ARRAY
Definition: compat.h:2341
@ VT_SAFEARRAY
Definition: compat.h:2321
@ VT_I4
Definition: compat.h:2298
@ VT_BOOL
Definition: compat.h:2306
@ VT_UI4
Definition: compat.h:2313
@ VT_EMPTY
Definition: compat.h:2295
@ VT_DISPATCH
Definition: compat.h:2304
@ VT_UI1
Definition: compat.h:2311
#define FAILED_UNEXPECTEDLY(hr)
Definition: precomp.h:121
SAFEARRAY *WINAPI SafeArrayCreateVector(VARTYPE vt, LONG lLbound, ULONG cElements)
Definition: safearray.c:677
HRESULT WINAPI SafeArrayDestroy(SAFEARRAY *psa)
Definition: safearray.c:1347
DWORD dwThreadId
Definition: fdebug.c:31
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
HRESULT QueryInterface([in] REFIID riid, [out, iid_is(riid)] void **ppvObject)
#define S_OK
Definition: intsafe.h:52
static HMODULE MODULEINFO DWORD cb
Definition: module.c:33
#define _Out_opt_
Definition: no_sal2.h:214
#define _Inout_
Definition: no_sal2.h:162
#define _Out_
Definition: no_sal2.h:160
#define _In_
Definition: no_sal2.h:158
#define UNREFERENCED_PARAMETER(P)
Definition: ntbasedef.h:325
#define V_ARRAY(A)
Definition: oleauto.h:222
#define V_UNKNOWN(A)
Definition: oleauto.h:281
#define V_VT(A)
Definition: oleauto.h:211
#define V_DISPATCH(A)
Definition: oleauto.h:239
long LONG
Definition: pedump.c:60
DWORD WINAPI WinList_Init(void)
Definition: shdocvw_main.c:246
#define ILGetSize
Definition: shellclasses.h:638
HRESULT hr
Definition: shlfolder.c:183
_In_ int _In_ BOOL bCreate
Definition: shlobj.h:1528
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
Definition: shtypes.idl:42
#define TRACE(s)
Definition: solgame.cpp:4
PVOID pvData
Definition: compat.h:2359
ULONG_PTR SIZE_T
Definition: typedefs.h:80
int32_t INT
Definition: typedefs.h:58
int32_t * PLONG
Definition: typedefs.h:58
HRESULT WINAPI DECLSPEC_HOTPATCH VariantClear(VARIANTARG *pVarg)
Definition: variant.c:648
void WINAPI VariantInit(VARIANTARG *pVarg)
Definition: variant.c:568
#define CopyMemory
Definition: winbase.h:1741
CONST void * LPCVOID
Definition: windef.h:191
#define WINAPI
Definition: msvc.h:6
#define E_UNEXPECTED
Definition: winerror.h:2456
EXTERN_C HRESULT WINAPI WinList_FindFolderWindow(_In_ LPCITEMIDLIST pidl, _In_ DWORD dwUnused, _Out_opt_ PLONG phwnd, _Out_opt_ IWebBrowserApp **ppWebBrowserApp)
Definition: winlist.cpp:151
EXTERN_C VOID WINAPI WinList_Terminate(VOID)
Definition: winlist.cpp:92
static HRESULT InitVariantFromBuffer(_Out_ LPVARIANTARG pvarg, _In_ LPCVOID pv, _In_ SIZE_T cb)
Definition: winlist.cpp:16
static HRESULT InitVariantFromIDList(_Out_ LPVARIANTARG pvarg, _In_ LPCITEMIDLIST pidl)
Definition: winlist.cpp:37
EXTERN_C HRESULT WINAPI WinList_NotifyNewLocation(_In_ IShellWindows *pShellWindows, _In_ LONG lCookie, _In_ LPCITEMIDLIST pidl)
Definition: winlist.cpp:120
static HRESULT VariantClearLazy(_Inout_ LPVARIANTARG pvarg)
Definition: winlist.cpp:45
EXTERN_C IShellWindows *WINAPI WinList_GetShellWindows(_In_ BOOL bCreate)
Definition: winlist.cpp:105
EXTERN_C HRESULT WINAPI WinList_Revoke(_In_ LONG lCookie)
Definition: winlist.cpp:242
static VARIANT s_vaEmpty
Definition: winlist.cpp:13
EXTERN_C HRESULT WINAPI WinList_RegisterPending(_In_ DWORD dwThreadId, _In_ LPCITEMIDLIST pidl, _In_ DWORD dwUnused, _Out_ PLONG plCookie)
Definition: winlist.cpp:203
#define IID_PPV_ARG(Itype, ppType)