[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.
This commit is contained in:
Katayama Hirofumi MZ 2025-02-01 07:14:36 +09:00 committed by GitHub
parent f335322ace
commit ee19792605
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
9 changed files with 300 additions and 21 deletions

View file

@ -42,6 +42,7 @@
#include <shlwapi_undoc.h>
#include <shlobj_undoc.h>
#include <shlguid_undoc.h>
#include <shdocvw_undoc.h>
#include <undocshell.h>
#include <ui/rosctrls.h>
@ -119,7 +120,7 @@ VOID InitRSHELL(VOID);
HRESULT WINAPI _CStartMenu_CreateInstance(REFIID riid, void **ppv);
HANDLE WINAPI _SHCreateDesktop(IShellDesktopTray *ShellDesk);
BOOL WINAPI _SHDesktopMessageLoop(HANDLE hDesktop);
DWORD WINAPI _WinList_Init(void);
BOOL WINAPI _WinList_Init(void);
void WINAPI _ShellDDEInit(BOOL bInit);
HRESULT WINAPI _CBandSiteMenu_CreateInstance(REFIID riid, void **ppv);
HRESULT WINAPI _CBandSite_CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, void **ppv);

View file

@ -105,9 +105,9 @@ BOOL WINAPI _SHDesktopMessageLoop(HANDLE hDesktop)
return FALSE;
}
typedef DWORD(WINAPI* PWINLIST_INIT)(void);
typedef BOOL (WINAPI *PWINLIST_INIT)(void);
DWORD WINAPI _WinList_Init(void)
BOOL WINAPI _WinList_Init(void)
{
HINSTANCE hFallback;
@ -131,7 +131,7 @@ DWORD WINAPI _WinList_Init(void)
}
}
return 0;
return FALSE;
}
typedef void (WINAPI *PSHELLDDEINIT)(BOOL bInit);

View file

@ -52,12 +52,6 @@ extern "C"
HRESULT WINAPI RSHELL_CMergedFolder_CreateInstance(REFIID riid, LPVOID *ppv);
}
DWORD WINAPI WinList_Init(void)
{
/* do something here (perhaps we may want to add our own implementation fo win8) */
return 0;
}
class CRShellModule : public CComModule
{
public:

View file

@ -37,7 +37,8 @@ add_library(shdocvw_sublib OBJECT
CNSCBand.cpp
mrulist.cpp
objects.cpp
utility.cpp)
utility.cpp
winlist.cpp)
target_link_libraries(shdocvw_sublib PRIVATE atl_classes)
target_compile_definitions(shdocvw_sublib PRIVATE $<TARGET_PROPERTY:shdocvw,COMPILE_DEFINITIONS>)
target_compile_options(shdocvw_sublib PRIVATE $<TARGET_PROPERTY:shdocvw,COMPILE_OPTIONS>)

View file

@ -8,7 +8,7 @@
@ stdcall -private DllGetClassObject(ptr ptr ptr)
@ stdcall -private DllGetVersion(ptr)
110 stdcall -noname WinList_Init()
111 stub -noname WinList_Terminate
111 stdcall -noname WinList_Terminate()
@ stdcall -private DllInstall(long wstr)
@ stdcall -private DllRegisterServer()
@ stub DllRegisterWindowClasses
@ -74,11 +74,11 @@
174 stub -noname SHIsGlobalOffline
175 stub -noname DetectAndFixAssociations
176 stub -noname EnsureWebViewRegSettings
177 stub -noname WinList_NotifyNewLocation
178 stub -noname WinList_FindFolderWindow
179 stub -noname WinList_GetShellWindows
180 stub -noname WinList_RegisterPending
181 stub -noname WinList_Revoke
177 stdcall -noname WinList_NotifyNewLocation(ptr long ptr)
178 stdcall -noname WinList_FindFolderWindow(ptr long ptr ptr)
179 stdcall -noname WinList_GetShellWindows(long)
180 stdcall -noname WinList_RegisterPending(long ptr long ptr)
181 stdcall -noname WinList_Revoke(long)
182 stdcall SetQueryNetSessionCount(long)
183 stub -noname SHMapNbspToSp
184 stub SetShellOfflineState

View file

@ -236,6 +236,7 @@ static BOOL SHDOCVW_LoadShell32(void)
return ((SHDOCVW_hshell32 = LoadLibraryA("shell32.dll")) != NULL);
}
#ifndef __REACTOS__ /* See winlist.cpp */
/***********************************************************************
* @ (SHDOCVW.110)
*
@ -247,6 +248,7 @@ DWORD WINAPI WinList_Init(void)
FIXME("(), stub!\n");
return 0x0deadfeed;
}
#endif /* ndef __REACTOS__ */
/***********************************************************************
* @ (SHDOCVW.118)

View file

@ -0,0 +1,255 @@
/*
* PROJECT: ReactOS shdocvw
* LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
* PURPOSE: CLSID_ShellWindows and WinList_* functions
* COPYRIGHT: Copyright 2025 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
*/
#include "objects.h"
#include <wine/debug.h>
WINE_DEFAULT_DEBUG_CHANNEL(shdocvw);
static VARIANT s_vaEmpty = { VT_EMPTY };
static HRESULT
InitVariantFromBuffer(
_Out_ LPVARIANTARG pvarg,
_In_ LPCVOID pv,
_In_ SIZE_T cb)
{
VariantInit(pvarg);
LPSAFEARRAY pArray = SafeArrayCreateVector(VT_UI1, 0, cb);
if (!pArray)
{
ERR("!pArray\n");
return E_OUTOFMEMORY;
}
V_ARRAY(pvarg) = pArray;
V_VT(pvarg) = VT_ARRAY | VT_UI1;
CopyMemory(pArray->pvData, pv, cb);
return S_OK;
}
static HRESULT
InitVariantFromIDList(
_Out_ LPVARIANTARG pvarg,
_In_ LPCITEMIDLIST pidl)
{
return InitVariantFromBuffer(pvarg, pidl, ILGetSize(pidl));
}
static HRESULT
VariantClearLazy(_Inout_ LPVARIANTARG pvarg)
{
switch (V_VT(pvarg))
{
case VT_EMPTY:
case VT_BOOL:
case VT_I4:
case VT_UI4:
break;
case VT_UNKNOWN:
if (V_UNKNOWN(pvarg))
V_UNKNOWN(pvarg)->Release();
break;
case VT_DISPATCH:
if (V_DISPATCH(pvarg))
V_DISPATCH(pvarg)->Release();
break;
case VT_SAFEARRAY:
SafeArrayDestroy(V_ARRAY(pvarg));
break;
default:
return VariantClear(pvarg);
}
V_VT(pvarg) = VT_EMPTY;
return S_OK;
}
/*************************************************************************
* WinList_Init (SHDOCVW.110)
*
* Retired in NT 6.1.
*/
EXTERN_C
BOOL WINAPI
WinList_Init(VOID)
{
FIXME("()\n");
return FALSE;
}
/*************************************************************************
* WinList_Terminate (SHDOCVW.111)
*
* NT 4.71 and higher. Retired in NT 6.1.
*/
EXTERN_C
VOID WINAPI
WinList_Terminate(VOID)
{
FIXME("()\n");
}
/*************************************************************************
* WinList_GetShellWindows (SHDOCVW.179)
*
* NT 5.0 and higher.
* @see https://learn.microsoft.com/en-us/windows/win32/api/exdisp/nn-exdisp-ishellwindows
*/
EXTERN_C
IShellWindows* WINAPI
WinList_GetShellWindows(
_In_ BOOL bCreate)
{
FIXME("(%d)\n", bCreate);
return NULL;
}
/*************************************************************************
* WinList_NotifyNewLocation (SHDOCVW.177)
*
* NT 5.0 and higher.
* @see https://learn.microsoft.com/en-us/windows/win32/api/exdisp/nf-exdisp-ishellwindows-onnavigate
*/
EXTERN_C
HRESULT WINAPI
WinList_NotifyNewLocation(
_In_ IShellWindows *pShellWindows,
_In_ LONG lCookie,
_In_ LPCITEMIDLIST pidl)
{
TRACE("(%p, %ld, %p)\n", pShellWindows, lCookie, pidl);
if (!pidl)
{
ERR("!pidl\n");
return E_UNEXPECTED;
}
VARIANTARG varg;
HRESULT hr = InitVariantFromIDList(&varg, pidl);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
hr = pShellWindows->OnNavigate(lCookie, &varg);
VariantClearLazy(&varg);
return hr;
}
/*************************************************************************
* WinList_FindFolderWindow (SHDOCVW.178)
*
* NT 5.0 and higher.
* @see https://learn.microsoft.com/en-us/windows/win32/api/exdisp/nf-exdisp-ishellwindows-findwindowsw
*/
EXTERN_C
HRESULT WINAPI
WinList_FindFolderWindow(
_In_ LPCITEMIDLIST pidl,
_In_ DWORD dwUnused,
_Out_opt_ PLONG phwnd, // Stores a window handle but LONG type
_Out_opt_ IWebBrowserApp **ppWebBrowserApp)
{
UNREFERENCED_PARAMETER(dwUnused);
TRACE("(%p, %ld, %p, %p)\n", pidl, dwUnused, phwnd, ppWebBrowserApp);
if (ppWebBrowserApp)
*ppWebBrowserApp = NULL;
if (phwnd)
*phwnd = 0;
if (!pidl)
{
ERR("!pidl\n");
return E_UNEXPECTED;
}
CComPtr<IShellWindows> pShellWindows(WinList_GetShellWindows(ppWebBrowserApp != NULL));
if (!pShellWindows)
{
ERR("!pShellWindows\n");
return E_UNEXPECTED;
}
VARIANTARG varg;
HRESULT hr = InitVariantFromIDList(&varg, pidl);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
CComPtr<IDispatch> pDispatch;
const INT options = SWFO_INCLUDEPENDING | (ppWebBrowserApp ? SWFO_NEEDDISPATCH : 0);
hr = pShellWindows->FindWindowSW(&varg, &s_vaEmpty, SWC_BROWSER, phwnd, options, &pDispatch);
if (pDispatch && ppWebBrowserApp)
hr = pDispatch->QueryInterface(IID_PPV_ARG(IWebBrowserApp, ppWebBrowserApp));
VariantClearLazy(&varg);
return hr;
}
/*************************************************************************
* WinList_RegisterPending (SHDOCVW.180)
*
* NT 5.0 and higher.
* @see https://learn.microsoft.com/en-us/windows/win32/api/exdisp/nf-exdisp-ishellwindows-registerpending
*/
EXTERN_C
HRESULT WINAPI
WinList_RegisterPending(
_In_ DWORD dwThreadId,
_In_ LPCITEMIDLIST pidl,
_In_ DWORD dwUnused,
_Out_ PLONG plCookie)
{
TRACE("(%ld, %p, %ld, %p)\n", dwThreadId, pidl, dwUnused, plCookie);
if (!pidl)
{
ERR("!pidl\n");
return E_UNEXPECTED;
}
CComPtr<IShellWindows> pShellWindows(WinList_GetShellWindows(FALSE));
if (!pShellWindows)
{
ERR("!pShellWindows\n");
return E_UNEXPECTED;
}
VARIANTARG varg;
HRESULT hr = InitVariantFromIDList(&varg, pidl);
if (FAILED_UNEXPECTEDLY(hr))
return hr;
hr = pShellWindows->RegisterPending(dwThreadId, &varg, &s_vaEmpty, SWC_BROWSER, plCookie);
VariantClearLazy(&varg);
return hr;
}
/*************************************************************************
* WinList_Revoke (SHDOCVW.181)
*
* NT 5.0 and higher.
* @see https://learn.microsoft.com/en-us/windows/win32/api/exdisp/nf-exdisp-ishellwindows-revoke
*/
EXTERN_C
HRESULT WINAPI
WinList_Revoke(
_In_ LONG lCookie)
{
TRACE("(%ld)\n", lCookie);
CComPtr<IShellWindows> pShellWindows(WinList_GetShellWindows(TRUE));
if (!pShellWindows)
{
ERR("!pShellWindows\n");
return E_FAIL;
}
return pShellWindows->Revoke(lCookie);
}

View file

@ -2,14 +2,16 @@
* PROJECT: ReactOS Headers
* LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
* PURPOSE: shdocvw.dll undocumented APIs
* COPYRIGHT: Copyright 2024 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
* COPYRIGHT: Copyright 2024-2025 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
*/
#pragma once
#include <exdisp.h> // For IShellWindows
#ifdef __cplusplus
extern "C" {
#endif /* defined(__cplusplus) */
#endif
BOOL WINAPI
IEILIsEqual(
@ -17,6 +19,31 @@ IEILIsEqual(
_In_ LPCITEMIDLIST pidl2,
_In_ BOOL bUnknown);
BOOL WINAPI WinList_Init(VOID);
VOID WINAPI WinList_Terminate(VOID);
HRESULT WINAPI WinList_Revoke(_In_ LONG lCookie);
IShellWindows* WINAPI WinList_GetShellWindows(_In_ BOOL bCreate);
HRESULT WINAPI
WinList_NotifyNewLocation(
_In_ IShellWindows *pShellWindows,
_In_ LONG lCookie,
_In_ LPCITEMIDLIST pidl);
HRESULT WINAPI
WinList_FindFolderWindow(
_In_ LPCITEMIDLIST pidl,
_In_ DWORD dwUnused,
_Out_opt_ PLONG phwnd,
_Out_opt_ IWebBrowserApp **ppWebBrowserApp);
HRESULT WINAPI
WinList_RegisterPending(
_In_ DWORD dwThreadId,
_In_ LPCITEMIDLIST pidl,
_In_ DWORD dwUnused,
_Out_ PLONG plCookie);
#ifdef __cplusplus
} /* extern "C" */
#endif /* defined(__cplusplus) */
#endif

View file

@ -928,7 +928,6 @@ BOOL WINAPI SHSettingsChanged(LPCVOID unused, LPCWSTR pszKey);
#define TABDMC_LOADINPROC 2
void WINAPI ShellDDEInit(BOOL bInit);
DWORD WINAPI WinList_Init(void);
IStream* WINAPI SHGetViewStream(LPCITEMIDLIST, DWORD, LPCTSTR, LPCTSTR, LPCTSTR);