Reactos
1/*
2 * PROJECT: ReactOS API tests
3 * LICENSE: GPL-2.0+ (https://spdx.org/licenses/GPL-2.0+)
4 * PURPOSE: Test for SHShouldShowWizards
5 * COPYRIGHT: Copyright 2025 Katayama Hirofumi MZ (katayama.hirofumi.mz@gmail.com)
6 */
7
8#include "shelltest.h"
9#include <undocshell.h>
10#include <versionhelpers.h>
11
12class CDummyClass
13 : public IServiceProvider
14 , public IShellBrowser
15{
16public:
17 CDummyClass() { }
18
19 IUnknown *GetUnknown()
20 {
21 return static_cast<IServiceProvider *>(this);
22 }
23
24 // *** IUnknown methods ***
25 STDMETHODIMP QueryInterface(REFIID riid, VOID **ppvObj) override
26 {
27 if (riid == IID_IUnknown || riid == IID_IServiceProvider)
28 {
29 AddRef();
30 *ppvObj = static_cast<IServiceProvider *>(this);
31 return S_OK;
32 }
33 return E_NOINTERFACE;
34 }
35 STDMETHODIMP_(ULONG) AddRef() override
36 {
37 return 1;
38 }
39 STDMETHODIMP_(ULONG) Release() override
40 {
41 return 1;
42 }
43
44 // *** IOleWindow methods ***
45 STDMETHODIMP GetWindow(HWND *phwnd) override { return E_NOTIMPL; }
46 STDMETHODIMP ContextSensitiveHelp(BOOL fEnterMode) override { return E_NOTIMPL; }
47
48 // *** IShellBrowser methods ***
49 STDMETHODIMP InsertMenusSB(HMENU hmenuShared, LPOLEMENUGROUPWIDTHS lpMenuWidths) override { return E_NOTIMPL; }
50 STDMETHODIMP SetMenuSB(HMENU hmenuShared, HOLEMENU holemenuRes, HWND hwndActiveObject) override { return E_NOTIMPL; }
51 STDMETHODIMP RemoveMenusSB(HMENU hmenuShared) override { return E_NOTIMPL; }
52 STDMETHODIMP SetStatusTextSB(LPCOLESTR pszStatusText) override { return E_NOTIMPL; }
53 STDMETHODIMP EnableModelessSB(BOOL fEnable) override { return E_NOTIMPL; }
54 STDMETHODIMP TranslateAcceleratorSB(MSG *pmsg, WORD wID) override { return E_NOTIMPL; }
55 STDMETHODIMP BrowseObject(LPCITEMIDLIST pidl, UINT wFlags) override { return E_NOTIMPL; }
56 STDMETHODIMP GetViewStateStream(DWORD grfMode, IStream **ppStrm) override { return E_NOTIMPL; }
57 STDMETHODIMP GetControlWindow(UINT id, HWND *lphwnd) override { return E_NOTIMPL; }
58 STDMETHODIMP SendControlMsg(UINT id, UINT uMsg, WPARAM wParam, LPARAM lParam, LRESULT *pret) override { return E_NOTIMPL; }
59 STDMETHODIMP QueryActiveShellView(struct IShellView **ppshv) override { return E_NOTIMPL; }
60 STDMETHODIMP OnViewWindowActive(struct IShellView *ppshv) override { return E_NOTIMPL; }
61 STDMETHODIMP SetToolbarItems(LPTBBUTTON lpButtons, UINT nButtons, UINT uFlags) override { return E_NOTIMPL; }
62
63 // *** IServiceProvider methods ***
64 STDMETHODIMP QueryService(REFGUID guidService, REFIID riid, void **ppvObject) override
65 {
66 if (riid == IID_IShellBrowser)
67 {
68 AddRef();
69 *ppvObject = static_cast<IShellBrowser *>(this);
70 return S_OK;
71 }
72 return E_FAIL;
73 }
74};
75
76static VOID SetShowWizardsTEST(BOOL bValue)
77{
78 DWORD dwValue = bValue;
79 SHRegSetUSValueW(L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
80 L"ShowWizardsTEST", REG_DWORD, &dwValue, sizeof(dwValue), SHREGSET_FORCE_HKCU);
81}
82
83START_TEST(SHShouldShowWizards)
84{
85 // Save old values
86 SHELLSTATE state;
87 SHGetSetSettings(&state, SSF_WEBVIEW, FALSE);
88 BOOL bOldWebView = state.fWebView;
89 BOOL bOldTestValue = SHRegGetBoolUSValueW(
90 L"Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
91 L"ShowWizardsTEST",
92 FALSE,
93 FALSE);
94
95 CDummyClass dummy;
96 HRESULT hr;
97
98 state.fWebView = FALSE;
99 SHGetSetSettings(&state, SSF_WEBVIEW, TRUE);
100 SetShowWizardsTEST(FALSE);
101 hr = SHShouldShowWizards(dummy.GetUnknown());
102 ok_hex(hr, (GetNTVersion() >= _WIN32_WINNT_WIN8) ? S_FALSE : S_OK);
103
104 SetShowWizardsTEST(TRUE);
105 hr = SHShouldShowWizards(dummy.GetUnknown());
106 ok_hex(hr, (GetNTVersion() >= _WIN32_WINNT_WIN8) ? S_FALSE : S_OK);
107
108 state.fWebView = TRUE;
109 SHGetSetSettings(&state, SSF_WEBVIEW, TRUE);
110 SetShowWizardsTEST(FALSE);
111 hr = SHShouldShowWizards(dummy.GetUnknown());
112 ok_hex(hr, S_FALSE);
113
114 SetShowWizardsTEST(TRUE);
115 hr = SHShouldShowWizards(dummy.GetUnknown());
116 ok_hex(hr, (GetNTVersion() >= _WIN32_WINNT_WIN7) ? S_FALSE : S_OK);
117
118 // Restore old values
119 state.fWebView = bOldWebView;
120 SHGetSetSettings(&state, SSF_WEBVIEW, TRUE);
121 SetShowWizardsTEST(bOldTestValue);
122}