Skip to content

Commit ee19792

Browse files
authored
[SHDOCVW][EXPLORER][RSHELL][SDK] Populate WinList_* stubs (reactos#7691)
Implementing missing features... JIRA issue: CORE-9368 - Modify shdocvw.spec. - Add dll/win32/shdocvw/winlist.cpp. - Add stubs of WinList_* functions. - Add WinList_* function prototypes to <shdocvw_undoc.h>. - Adapt explorer and rshell to new WinList_Init prototype.
1 parent f335322 commit ee19792

File tree

9 files changed

+300
-21
lines changed

9 files changed

+300
-21
lines changed

base/shell/explorer/precomp.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
#include <shlwapi_undoc.h>
4343
#include <shlobj_undoc.h>
4444
#include <shlguid_undoc.h>
45+
#include <shdocvw_undoc.h>
4546
#include <undocshell.h>
4647

4748
#include <ui/rosctrls.h>
@@ -119,7 +120,7 @@ VOID InitRSHELL(VOID);
119120
HRESULT WINAPI _CStartMenu_CreateInstance(REFIID riid, void **ppv);
120121
HANDLE WINAPI _SHCreateDesktop(IShellDesktopTray *ShellDesk);
121122
BOOL WINAPI _SHDesktopMessageLoop(HANDLE hDesktop);
122-
DWORD WINAPI _WinList_Init(void);
123+
BOOL WINAPI _WinList_Init(void);
123124
void WINAPI _ShellDDEInit(BOOL bInit);
124125
HRESULT WINAPI _CBandSiteMenu_CreateInstance(REFIID riid, void **ppv);
125126
HRESULT WINAPI _CBandSite_CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, void **ppv);

base/shell/explorer/rshell.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -105,9 +105,9 @@ BOOL WINAPI _SHDesktopMessageLoop(HANDLE hDesktop)
105105
return FALSE;
106106
}
107107

108-
typedef DWORD(WINAPI* PWINLIST_INIT)(void);
108+
typedef BOOL (WINAPI *PWINLIST_INIT)(void);
109109

110-
DWORD WINAPI _WinList_Init(void)
110+
BOOL WINAPI _WinList_Init(void)
111111
{
112112
HINSTANCE hFallback;
113113

@@ -131,7 +131,7 @@ DWORD WINAPI _WinList_Init(void)
131131
}
132132
}
133133

134-
return 0;
134+
return FALSE;
135135
}
136136

137137
typedef void (WINAPI *PSHELLDDEINIT)(BOOL bInit);

base/shell/rshell/misc.cpp

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,6 @@ extern "C"
5252
HRESULT WINAPI RSHELL_CMergedFolder_CreateInstance(REFIID riid, LPVOID *ppv);
5353
}
5454

55-
DWORD WINAPI WinList_Init(void)
56-
{
57-
/* do something here (perhaps we may want to add our own implementation fo win8) */
58-
return 0;
59-
}
60-
6155
class CRShellModule : public CComModule
6256
{
6357
public:

dll/win32/shdocvw/CMakeLists.txt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,8 @@ add_library(shdocvw_sublib OBJECT
3737
CNSCBand.cpp
3838
mrulist.cpp
3939
objects.cpp
40-
utility.cpp)
40+
utility.cpp
41+
winlist.cpp)
4142
target_link_libraries(shdocvw_sublib PRIVATE atl_classes)
4243
target_compile_definitions(shdocvw_sublib PRIVATE $<TARGET_PROPERTY:shdocvw,COMPILE_DEFINITIONS>)
4344
target_compile_options(shdocvw_sublib PRIVATE $<TARGET_PROPERTY:shdocvw,COMPILE_OPTIONS>)

dll/win32/shdocvw/shdocvw.spec

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
@ stdcall -private DllGetClassObject(ptr ptr ptr)
99
@ stdcall -private DllGetVersion(ptr)
1010
110 stdcall -noname WinList_Init()
11-
111 stub -noname WinList_Terminate
11+
111 stdcall -noname WinList_Terminate()
1212
@ stdcall -private DllInstall(long wstr)
1313
@ stdcall -private DllRegisterServer()
1414
@ stub DllRegisterWindowClasses
@@ -74,11 +74,11 @@
7474
174 stub -noname SHIsGlobalOffline
7575
175 stub -noname DetectAndFixAssociations
7676
176 stub -noname EnsureWebViewRegSettings
77-
177 stub -noname WinList_NotifyNewLocation
78-
178 stub -noname WinList_FindFolderWindow
79-
179 stub -noname WinList_GetShellWindows
80-
180 stub -noname WinList_RegisterPending
81-
181 stub -noname WinList_Revoke
77+
177 stdcall -noname WinList_NotifyNewLocation(ptr long ptr)
78+
178 stdcall -noname WinList_FindFolderWindow(ptr long ptr ptr)
79+
179 stdcall -noname WinList_GetShellWindows(long)
80+
180 stdcall -noname WinList_RegisterPending(long ptr long ptr)
81+
181 stdcall -noname WinList_Revoke(long)
8282
182 stdcall SetQueryNetSessionCount(long)
8383
183 stub -noname SHMapNbspToSp
8484
184 stub SetShellOfflineState

dll/win32/shdocvw/shdocvw_main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,7 @@ static BOOL SHDOCVW_LoadShell32(void)
236236
return ((SHDOCVW_hshell32 = LoadLibraryA("shell32.dll")) != NULL);
237237
}
238238

239+
#ifndef __REACTOS__ /* See winlist.cpp */
239240
/***********************************************************************
240241
* @ (SHDOCVW.110)
241242
*
@@ -247,6 +248,7 @@ DWORD WINAPI WinList_Init(void)
247248
FIXME("(), stub!\n");
248249
return 0x0deadfeed;
249250
}
251+
#endif /* ndef __REACTOS__ */
250252

251253
/***********************************************************************
252254
* @ (SHDOCVW.118)

dll/win32/shdocvw/winlist.cpp

Lines changed: 255 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,255 @@
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 <[email protected]>
6+
*/
7+
8+
#include "objects.h"
9+
10+
#include <wine/debug.h>
11+
WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
12+
13+
static VARIANT s_vaEmpty = { VT_EMPTY };
14+
15+
static HRESULT
16+
InitVariantFromBuffer(
17+
_Out_ LPVARIANTARG pvarg,
18+
_In_ LPCVOID pv,
19+
_In_ SIZE_T cb)
20+
{
21+
VariantInit(pvarg);
22+
23+
LPSAFEARRAY pArray = SafeArrayCreateVector(VT_UI1, 0, cb);
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+
36+
static HRESULT
37+
InitVariantFromIDList(
38+
_Out_ LPVARIANTARG pvarg,
39+
_In_ LPCITEMIDLIST pidl)
40+
{
41+
return InitVariantFromBuffer(pvarg, pidl, ILGetSize(pidl));
42+
}
43+
44+
static HRESULT
45+
VariantClearLazy(_Inout_ LPVARIANTARG pvarg)
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:
63+
SafeArrayDestroy(V_ARRAY(pvarg));
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+
*/
77+
EXTERN_C
78+
BOOL WINAPI
79+
WinList_Init(VOID)
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+
*/
90+
EXTERN_C
91+
VOID WINAPI
92+
WinList_Terminate(VOID)
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+
*/
103+
EXTERN_C
104+
IShellWindows* WINAPI
105+
WinList_GetShellWindows(
106+
_In_ BOOL bCreate)
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+
*/
118+
EXTERN_C
119+
HRESULT WINAPI
120+
WinList_NotifyNewLocation(
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);
135+
if (FAILED_UNEXPECTEDLY(hr))
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+
*/
149+
EXTERN_C
150+
HRESULT WINAPI
151+
WinList_FindFolderWindow(
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);
182+
if (FAILED_UNEXPECTEDLY(hr))
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+
*/
201+
EXTERN_C
202+
HRESULT WINAPI
203+
WinList_RegisterPending(
204+
_In_ DWORD dwThreadId,
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);
226+
if (FAILED_UNEXPECTEDLY(hr))
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+
*/
240+
EXTERN_C
241+
HRESULT WINAPI
242+
WinList_Revoke(
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+
}

0 commit comments

Comments
 (0)