Reactos

[SHDOCVW][EXPLORER][RSHELL][SDK] Populate WinList_* stubs (#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.

authored by

Katayama Hirofumi MZ and committed by
GitHub
ee197926 f335322a

+300 -21
+2 -1
base/shell/explorer/precomp.h
··· 42 42 #include <shlwapi_undoc.h> 43 43 #include <shlobj_undoc.h> 44 44 #include <shlguid_undoc.h> 45 + #include <shdocvw_undoc.h> 45 46 #include <undocshell.h> 46 47 47 48 #include <ui/rosctrls.h> ··· 119 120 HRESULT WINAPI _CStartMenu_CreateInstance(REFIID riid, void **ppv); 120 121 HANDLE WINAPI _SHCreateDesktop(IShellDesktopTray *ShellDesk); 121 122 BOOL WINAPI _SHDesktopMessageLoop(HANDLE hDesktop); 122 - DWORD WINAPI _WinList_Init(void); 123 + BOOL WINAPI _WinList_Init(void); 123 124 void WINAPI _ShellDDEInit(BOOL bInit); 124 125 HRESULT WINAPI _CBandSiteMenu_CreateInstance(REFIID riid, void **ppv); 125 126 HRESULT WINAPI _CBandSite_CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, void **ppv);
+3 -3
base/shell/explorer/rshell.cpp
··· 105 105 return FALSE; 106 106 } 107 107 108 - typedef DWORD(WINAPI* PWINLIST_INIT)(void); 108 + typedef BOOL (WINAPI *PWINLIST_INIT)(void); 109 109 110 - DWORD WINAPI _WinList_Init(void) 110 + BOOL WINAPI _WinList_Init(void) 111 111 { 112 112 HINSTANCE hFallback; 113 113 ··· 131 131 } 132 132 } 133 133 134 - return 0; 134 + return FALSE; 135 135 } 136 136 137 137 typedef void (WINAPI *PSHELLDDEINIT)(BOOL bInit);
-6
base/shell/rshell/misc.cpp
··· 52 52 HRESULT WINAPI RSHELL_CMergedFolder_CreateInstance(REFIID riid, LPVOID *ppv); 53 53 } 54 54 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 - 61 55 class CRShellModule : public CComModule 62 56 { 63 57 public:
+2 -1
dll/win32/shdocvw/CMakeLists.txt
··· 37 37 CNSCBand.cpp 38 38 mrulist.cpp 39 39 objects.cpp 40 - utility.cpp) 40 + utility.cpp 41 + winlist.cpp) 41 42 target_link_libraries(shdocvw_sublib PRIVATE atl_classes) 42 43 target_compile_definitions(shdocvw_sublib PRIVATE $<TARGET_PROPERTY:shdocvw,COMPILE_DEFINITIONS>) 43 44 target_compile_options(shdocvw_sublib PRIVATE $<TARGET_PROPERTY:shdocvw,COMPILE_OPTIONS>)
+6 -6
dll/win32/shdocvw/shdocvw.spec
··· 8 8 @ stdcall -private DllGetClassObject(ptr ptr ptr) 9 9 @ stdcall -private DllGetVersion(ptr) 10 10 110 stdcall -noname WinList_Init() 11 - 111 stub -noname WinList_Terminate 11 + 111 stdcall -noname WinList_Terminate() 12 12 @ stdcall -private DllInstall(long wstr) 13 13 @ stdcall -private DllRegisterServer() 14 14 @ stub DllRegisterWindowClasses ··· 74 74 174 stub -noname SHIsGlobalOffline 75 75 175 stub -noname DetectAndFixAssociations 76 76 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) 82 82 182 stdcall SetQueryNetSessionCount(long) 83 83 183 stub -noname SHMapNbspToSp 84 84 184 stub SetShellOfflineState
+2
dll/win32/shdocvw/shdocvw_main.c
··· 236 236 return ((SHDOCVW_hshell32 = LoadLibraryA("shell32.dll")) != NULL); 237 237 } 238 238 239 + #ifndef __REACTOS__ /* See winlist.cpp */ 239 240 /*********************************************************************** 240 241 * @ (SHDOCVW.110) 241 242 * ··· 247 248 FIXME("(), stub!\n"); 248 249 return 0x0deadfeed; 249 250 } 251 + #endif /* ndef __REACTOS__ */ 250 252 251 253 /*********************************************************************** 252 254 * @ (SHDOCVW.118)
+255
dll/win32/shdocvw/winlist.cpp
··· 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> 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 + }
+30 -3
sdk/include/reactos/shdocvw_undoc.h
··· 2 2 * PROJECT: ReactOS Headers 3 3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later) 4 4 * PURPOSE: shdocvw.dll undocumented APIs 5 - * COPYRIGHT: Copyright 2024 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com> 5 + * COPYRIGHT: Copyright 2024-2025 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com> 6 6 */ 7 7 8 8 #pragma once 9 9 10 + #include <exdisp.h> // For IShellWindows 11 + 10 12 #ifdef __cplusplus 11 13 extern "C" { 12 - #endif /* defined(__cplusplus) */ 14 + #endif 13 15 14 16 BOOL WINAPI 15 17 IEILIsEqual( ··· 17 19 _In_ LPCITEMIDLIST pidl2, 18 20 _In_ BOOL bUnknown); 19 21 22 + BOOL WINAPI WinList_Init(VOID); 23 + VOID WINAPI WinList_Terminate(VOID); 24 + HRESULT WINAPI WinList_Revoke(_In_ LONG lCookie); 25 + IShellWindows* WINAPI WinList_GetShellWindows(_In_ BOOL bCreate); 26 + 27 + HRESULT WINAPI 28 + WinList_NotifyNewLocation( 29 + _In_ IShellWindows *pShellWindows, 30 + _In_ LONG lCookie, 31 + _In_ LPCITEMIDLIST pidl); 32 + 33 + HRESULT WINAPI 34 + WinList_FindFolderWindow( 35 + _In_ LPCITEMIDLIST pidl, 36 + _In_ DWORD dwUnused, 37 + _Out_opt_ PLONG phwnd, 38 + _Out_opt_ IWebBrowserApp **ppWebBrowserApp); 39 + 40 + HRESULT WINAPI 41 + WinList_RegisterPending( 42 + _In_ DWORD dwThreadId, 43 + _In_ LPCITEMIDLIST pidl, 44 + _In_ DWORD dwUnused, 45 + _Out_ PLONG plCookie); 46 + 20 47 #ifdef __cplusplus 21 48 } /* extern "C" */ 22 - #endif /* defined(__cplusplus) */ 49 + #endif
-1
sdk/include/reactos/undocshell.h
··· 928 928 #define TABDMC_LOADINPROC 2 929 929 930 930 void WINAPI ShellDDEInit(BOOL bInit); 931 - DWORD WINAPI WinList_Init(void); 932 931 933 932 IStream* WINAPI SHGetViewStream(LPCITEMIDLIST, DWORD, LPCTSTR, LPCTSTR, LPCTSTR); 934 933