https://git.reactos.org/?p=reactos.git;a=commitdiff;h=b68104a8a08a79a95a7426...
commit b68104a8a08a79a95a7426e3966f1d20769cc741 Author: Katayama Hirofumi MZ katayama.hirofumi.mz@gmail.com AuthorDate: Fri Jan 17 13:36:20 2025 +0900 Commit: GitHub noreply@github.com CommitDate: Fri Jan 17 13:36:20 2025 +0900
[SHELL32][SHELL32_APITEST][SDK] Implement SHShouldShowWizards (#7614)
Implementing missing features... JIRA issue: CORE-19278 - Move function definition from stubs.cpp into utils.cpp. - Add prototype to <undocshell.h>. --- dll/win32/shell32/stubs.cpp | 11 -- dll/win32/shell32/utils.cpp | 30 +++++ modules/rostests/apitests/shell32/CMakeLists.txt | 1 + .../apitests/shell32/SHShouldShowWizards.cpp | 123 +++++++++++++++++++++ modules/rostests/apitests/shell32/testlist.c | 2 + sdk/include/reactos/undocshell.h | 2 + 6 files changed, 158 insertions(+), 11 deletions(-)
diff --git a/dll/win32/shell32/stubs.cpp b/dll/win32/shell32/stubs.cpp index fa022eb6c07..d54e80c14af 100644 --- a/dll/win32/shell32/stubs.cpp +++ b/dll/win32/shell32/stubs.cpp @@ -896,17 +896,6 @@ SHSetUserPicturePathW(LPCWSTR lpPath, int csidl, LPVOID lpUnknown) return E_FAIL; }
-/* - * Unimplemented - */ -EXTERN_C BOOL -WINAPI -SHShouldShowWizards(LPVOID lpUnknown) -{ - FIXME("SHShouldShowWizards() stub\n"); - return FALSE; -} - /* * Unimplemented */ diff --git a/dll/win32/shell32/utils.cpp b/dll/win32/shell32/utils.cpp index 21e97461c52..c1761021e18 100644 --- a/dll/win32/shell32/utils.cpp +++ b/dll/win32/shell32/utils.cpp @@ -122,6 +122,36 @@ HRESULT SHILAppend(_Inout_ LPITEMIDLIST pidl, _Inout_ LPITEMIDLIST *ppidl) return hr; }
+/************************************************************************* + * SHShouldShowWizards [SHELL32.237] + * + * Used by printer and network features. + * @see https://undoc.airesoft.co.uk/shell32.dll/SHShouldShowWizards.php + */ +EXTERN_C +HRESULT WINAPI +SHShouldShowWizards(_In_ IUnknown *pUnknown) +{ + HRESULT hr; + IShellBrowser *pBrowser; + + hr = IUnknown_QueryService(pUnknown, SID_STopWindow, IID_PPV_ARG(IShellBrowser, &pBrowser)); + if (FAILED(hr)) + return hr; + + SHELLSTATE state; + SHGetSetSettings(&state, SSF_WEBVIEW, FALSE); + if (state.fWebView && + !SHRegGetBoolUSValueW(L"Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", + L"ShowWizardsTEST", FALSE, FALSE)) + { + hr = S_FALSE; + } + + pBrowser->Release(); + return hr; +} + static BOOL OpenEffectiveToken( _In_ DWORD DesiredAccess, diff --git a/modules/rostests/apitests/shell32/CMakeLists.txt b/modules/rostests/apitests/shell32/CMakeLists.txt index cad67b40a19..10ef4004e7c 100644 --- a/modules/rostests/apitests/shell32/CMakeLists.txt +++ b/modules/rostests/apitests/shell32/CMakeLists.txt @@ -33,6 +33,7 @@ list(APPEND SOURCE SHCreateFileExtractIconW.cpp SHParseDisplayName.cpp SHRestricted.cpp + SHShouldShowWizards.cpp She.cpp ShellExecCmdLine.cpp ShellExecuteEx.cpp diff --git a/modules/rostests/apitests/shell32/SHShouldShowWizards.cpp b/modules/rostests/apitests/shell32/SHShouldShowWizards.cpp new file mode 100644 index 00000000000..07b2f5846e3 --- /dev/null +++ b/modules/rostests/apitests/shell32/SHShouldShowWizards.cpp @@ -0,0 +1,123 @@ +/* + * PROJECT: ReactOS API tests + * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+) + * PURPOSE: Test for SHShouldShowWizards + * COPYRIGHT: Copyright 2025 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com) + */ + +#include "shelltest.h" +#include <undocshell.h> +#include <versionhelpers.h> + +class CDummyClass + : public IServiceProvider + , public IShellBrowser +{ +public: + CDummyClass() { } + + IUnknown *GetUnknown() + { + return static_cast<IServiceProvider *>(this); + } + + // *** IUnknown methods *** + STDMETHODIMP QueryInterface(REFIID riid, VOID **ppvObj) override + { + if (riid == IID_IUnknown || riid == IID_IServiceProvider) + { + AddRef(); + *ppvObj = static_cast<IServiceProvider *>(this); + return S_OK; + } + return E_NOINTERFACE; + } + STDMETHODIMP_(ULONG) AddRef() override + { + return 1; + } + STDMETHODIMP_(ULONG) Release() override + { + return 1; + } + + // *** IOleWindow methods *** + STDMETHODIMP GetWindow(HWND *phwnd) override { return E_NOTIMPL; } + STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode) override { return E_NOTIMPL; } + + // *** IShellBrowser methods *** + STDMETHODIMP InsertMenusSB(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths) override { return E_NOTIMPL; } + STDMETHODIMP SetMenuSB(HMENU hmenuShared, HOLEMENU holemenuRes, HWND hwndActiveObject) override { return E_NOTIMPL; } + STDMETHODIMP RemoveMenusSB(HMENU hmenuShared) override { return E_NOTIMPL; } + STDMETHODIMP SetStatusTextSB(LPCOLESTR pszStatusText) override { return E_NOTIMPL; } + STDMETHODIMP EnableModelessSB(BOOL fEnable) override { return E_NOTIMPL; } + STDMETHODIMP TranslateAcceleratorSB(MSG *pmsg, WORD wID) override { return E_NOTIMPL; } + STDMETHODIMP BrowseObject(LPCITEMIDLIST pidl, UINT wFlags) override { return E_NOTIMPL; } + STDMETHODIMP GetViewStateStream(DWORD grfMode, IStream **ppStrm) override { return E_NOTIMPL; } + STDMETHODIMP GetControlWindow(UINT id, HWND *lphwnd) override { return E_NOTIMPL; } + STDMETHODIMP SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret) override { return E_NOTIMPL; } + STDMETHODIMP QueryActiveShellView(struct IShellView **ppshv) override { return E_NOTIMPL; } + STDMETHODIMP OnViewWindowActive(struct IShellView *ppshv) override { return E_NOTIMPL; } + STDMETHODIMP SetToolbarItems(LPTBBUTTON lpButtons, UINT nButtons, UINT uFlags) override { return E_NOTIMPL; } + + // *** IServiceProvider methods *** + STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void **ppvObject) override + { + if (riid == IID_IShellBrowser) + { + AddRef(); + *ppvObject = static_cast<IShellBrowser *>(this); + return S_OK; + } + return E_FAIL; + } +}; + +static VOID SetShowWizardsTEST(BOOL bValue) +{ + DWORD dwValue = bValue; + SHRegSetUSValueW(L"Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", + L"ShowWizardsTEST", REG_DWORD, &dwValue, sizeof(dwValue), SHREGSET_FORCE_HKCU); +} + +START_TEST(SHShouldShowWizards) +{ + // Save old values + SHELLSTATE state; + SHGetSetSettings(&state, SSF_WEBVIEW, FALSE); + BOOL bOldWebView = state.fWebView; + BOOL bOldTestValue = SHRegGetBoolUSValueW( + L"Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced", + L"ShowWizardsTEST", + FALSE, + FALSE); + + CDummyClass dummy; + HRESULT hr; + const BOOL bVistaPlus = IsWindowsVistaOrGreater(); + + state.fWebView = FALSE; + SHGetSetSettings(&state, SSF_WEBVIEW, TRUE); + SetShowWizardsTEST(FALSE); + hr = SHShouldShowWizards(dummy.GetUnknown()); + ok_hex(hr, bVistaPlus ? S_FALSE : S_OK); + + SetShowWizardsTEST(TRUE); + hr = SHShouldShowWizards(dummy.GetUnknown()); + ok_hex(hr, bVistaPlus ? S_FALSE : S_OK); + + state.fWebView = TRUE; + SHGetSetSettings(&state, SSF_WEBVIEW, TRUE); + SetShowWizardsTEST(FALSE); + hr = SHShouldShowWizards(dummy.GetUnknown()); + ok_hex(hr, S_FALSE); + + SetShowWizardsTEST(TRUE); + hr = SHShouldShowWizards(dummy.GetUnknown()); + ok_hex(hr, bVistaPlus ? S_FALSE : S_OK); + + // Restore old values + state.fWebView = bOldWebView; + SHGetSetSettings(&state, SSF_WEBVIEW, TRUE); + SetShowWizardsTEST(bOldTestValue); +} diff --git a/modules/rostests/apitests/shell32/testlist.c b/modules/rostests/apitests/shell32/testlist.c index 87f924f9f23..0da5972b358 100644 --- a/modules/rostests/apitests/shell32/testlist.c +++ b/modules/rostests/apitests/shell32/testlist.c @@ -45,6 +45,7 @@ extern void func_SHGetFileInfo(void); extern void func_SHGetUserDisplayName(void); extern void func_SHLimitInputEdit(void); extern void func_SHParseDisplayName(void); +extern void func_SHShouldShowWizards(void); extern void func_SHSimpleIDListFromPath(void); extern void func_SHRestricted(void);
@@ -92,6 +93,7 @@ const struct test winetest_testlist[] = { "SHGetUserDisplayName", func_SHGetUserDisplayName }, { "SHLimitInputEdit", func_SHLimitInputEdit }, { "SHParseDisplayName", func_SHParseDisplayName }, + { "SHShouldShowWizards", func_SHShouldShowWizards }, { "SHSimpleIDListFromPath", func_SHSimpleIDListFromPath }, { "SHRestricted", func_SHRestricted },
diff --git a/sdk/include/reactos/undocshell.h b/sdk/include/reactos/undocshell.h index 76e78372dd1..3e685e08046 100644 --- a/sdk/include/reactos/undocshell.h +++ b/sdk/include/reactos/undocshell.h @@ -204,6 +204,8 @@ int WINAPI SHOutOfMemoryMessageBox( LPCSTR lpCaption, UINT uType);
+HRESULT WINAPI SHShouldShowWizards(_In_ IUnknown *pUnknown); + DWORD WINAPI SHNetConnectionDialog( HWND hwndOwner, LPCWSTR lpstrRemoteName,