ReactOS 0.4.17-dev-387-ga401325
SHEvaluateSystemCommandTemplate.cpp
Go to the documentation of this file.
1/*
2 * PROJECT: ReactOS api tests
3 * LICENSE: LGPL-2.1-or-later (https://spdx.org/licenses/LGPL-2.1-or-later)
4 * PURPOSE: Tests for SHEvaluateSystemCommandTemplate
5 * COPYRIGHT: Copyright 2026 Katayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
6 */
7
8#include "shelltest.h"
9#include <strsafe.h>
10#include <versionhelpers.h>
11
14
15#define ok_wstri(x, y) \
16 ok(lstrcmpiW(x, y) == 0, "Wrong string. Expected %s, got %s\n", wine_dbgstr_w(y), wine_dbgstr_w(x))
17
18static BOOL TEST_Init(void)
19{
22 GetProcAddress(hShell32, "SHEvaluateSystemCommandTemplate");
24 return TRUE;
25
26 HINSTANCE hSHLWAPI = GetModuleHandleA("shlwapi");
28 GetProcAddress(hSHLWAPI, MAKEINTRESOURCEA(552));
30 {
31 trace("shlwapi has SHEvaluateSystemCommandTemplate\n");
32 return TRUE;
33 }
34
35 skip("SHEvaluateSystemCommandTemplate not found\n");
36 return FALSE;
37}
38
39static void TEST_notepad(void)
40{
41 HRESULT hr;
42 PWSTR app, cmdline, params;
43 WCHAR szPath[MAX_PATH], szQuoted[MAX_PATH], szNotepad[MAX_PATH];
44 WCHAR szAnswer1[MAX_PATH], szAnswer2[MAX_PATH], szAnswer3[MAX_PATH];
45
46 GetSystemDirectoryW(szNotepad, _countof(szNotepad));
47 StringCchCatW(szNotepad, _countof(szNotepad), L"\\notepad.exe");
48 StringCchPrintfW(szAnswer1, _countof(szAnswer1), L"\"%s\"", szNotepad);
49 StringCchPrintfW(szAnswer2, _countof(szAnswer2), L"\"%s\" ", szNotepad);
50 StringCchPrintfW(szAnswer3, _countof(szAnswer3), L"\"%s\" /A /P", szNotepad);
51
52 hr = g_fnSHEvaluateSystemCommandTemplate(L"notepad.exe", &app, NULL, NULL);
53 ok_hr(hr, S_OK);
54 ok_wstri(app, szNotepad);
55 CoTaskMemFree(app);
56
57 hr = g_fnSHEvaluateSystemCommandTemplate(L"notepad.exe", &app, &cmdline, NULL);
58 ok_hr(hr, S_OK);
59 ok_wstri(app, szNotepad);
60 ok_wstri(cmdline, L"\"notepad.exe\" ");
61 CoTaskMemFree(app);
63
64 hr = g_fnSHEvaluateSystemCommandTemplate(L"notepad.exe", &app, &cmdline, &params);
65 ok_hr(hr, S_OK);
66 ok_wstri(app, szNotepad);
67 ok_wstri(cmdline, L"\"notepad.exe\" ");
68 ok_wstri(params, L"");
69 CoTaskMemFree(app);
72
73 hr = g_fnSHEvaluateSystemCommandTemplate(L"notepad.exe", &app, NULL, &params);
74 ok_hr(hr, S_OK);
75 ok_wstri(app, szNotepad);
76 ok_wstri(params, L"");
77 CoTaskMemFree(app);
79
80 hr = g_fnSHEvaluateSystemCommandTemplate(L"system32\\notepad.exe", &app, &cmdline, &params);
82 ok(app == NULL, "app was %s\n", wine_dbgstr_w(app));
83 ok(cmdline == NULL, "cmdline was %s\n", wine_dbgstr_w(cmdline));
84 ok(params == NULL, "params was %s\n", wine_dbgstr_w(params));
85 CoTaskMemFree(app);
88
89 hr = g_fnSHEvaluateSystemCommandTemplate(L"notepad.exe /A /P", &app, &cmdline, &params);
90 ok_hr(hr, S_OK);
91 ok_wstri(app, szNotepad);
92 ok_wstri(cmdline, L"\"notepad.exe\" /A /P");
93 ok_wstri(params, L"/A /P");
94 CoTaskMemFree(app);
97
100 ok_hr(hr, S_OK);
101 ok_wstri(app, szNotepad);
102 CoTaskMemFree(app);
103
104 StringCchCopyW(szPath, _countof(szPath), szNotepad);
106 ok_hr(hr, S_OK);
107 ok_wstri(app, szNotepad);
108 ok_wstri(params, L"");
109 CoTaskMemFree(app);
111
112 StringCchCopyW(szPath, _countof(szPath), szNotepad);
114 ok_hr(hr, S_OK);
115 ok_wstri(app, szNotepad);
116 ok_wstri(cmdline, szAnswer2);
117 ok_wstri(params, L"");
118 CoTaskMemFree(app);
121
122 StringCchPrintfW(szQuoted, _countof(szQuoted), L"\"%s\"", szNotepad);
124 ok_hr(hr, S_OK);
125 ok_wstri(app, szNotepad);
126 ok_wstri(cmdline, szAnswer2);
127 ok_wstri(params, L"");
128 CoTaskMemFree(app);
131
132 StringCchPrintfW(szQuoted, _countof(szQuoted), L"\"%s\" /A /P", szNotepad);
134 ok_hr(hr, S_OK);
135 ok_wstri(app, szNotepad);
136 ok_wstri(cmdline, szAnswer3);
137 ok_wstri(params, L"/A /P");
138 CoTaskMemFree(app);
141
142 hr = g_fnSHEvaluateSystemCommandTemplate(L"_invalid_\\_path_", &app, &cmdline, &params);
144 ok(app == NULL, "app was %s\n", wine_dbgstr_w(app));
145 ok(cmdline == NULL, "cmdline was %s\n", wine_dbgstr_w(cmdline));
146 ok(params == NULL, "params was %s\n", wine_dbgstr_w(params));
147 CoTaskMemFree(app);
150
151 hr = g_fnSHEvaluateSystemCommandTemplate(L"%SystemRoot%\\system32\\notepad.exe", &app, &cmdline, &params);
153 ok(app == NULL, "app was %s\n", wine_dbgstr_w(app));
154 ok(cmdline == NULL, "cmdline was %s\n", wine_dbgstr_w(cmdline));
155 ok(params == NULL, "params was %s\n", wine_dbgstr_w(params));
156 CoTaskMemFree(app);
159}
160
162{
163 if (!TEST_Init())
164 return;
165
166 TEST_notepad();
167}
#define ok_hr(status, expected)
Definition: ACListISF.cpp:31
#define ok_wstri(x, y)
static BOOL TEST_Init(void)
HRESULT(WINAPI * FN_SHEvaluateSystemCommandTemplate)(PCWSTR, PWSTR *, PWSTR *, PWSTR *)
static void TEST_notepad(void)
static FN_SHEvaluateSystemCommandTemplate g_fnSHEvaluateSystemCommandTemplate
#define trace
Definition: atltest.h:70
#define ok(value,...)
Definition: atltest.h:57
#define skip(...)
Definition: atltest.h:64
#define START_TEST(x)
Definition: atltest.h:75
HRESULT hr
Definition: delayimp.cpp:582
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
void WINAPI CoTaskMemFree(void *ptr)
Definition: malloc.c:389
#define GetProcAddress(x, y)
Definition: compat.h:753
#define MAX_PATH
Definition: compat.h:34
HMODULE WINAPI DECLSPEC_HOTPATCH GetModuleHandleA(LPCSTR lpModuleName)
Definition: loader.c:812
UINT WINAPI GetSystemDirectoryW(OUT LPWSTR lpBuffer, IN UINT uSize)
Definition: path.c:2232
#define L(x)
Definition: resources.c:13
EXTERN_C HRESULT WINAPI SHEvaluateSystemCommandTemplate(_In_ PCWSTR pszCmdTemplate, _Outptr_ PWSTR *ppszApplication, _Outptr_opt_ PWSTR *ppszCommandLine, _Outptr_opt_ PWSTR *ppszParameters)
Definition: evalcmd.cpp:178
unsigned int BOOL
Definition: ntddk_ex.h:94
GLenum const GLfloat * params
Definition: glext.h:5645
#define S_OK
Definition: intsafe.h:52
#define wine_dbgstr_w
Definition: kernel32.h:34
LPCWSTR szPath
Definition: env.c:37
static HMODULE hShell32
Definition: string.c:34
short WCHAR
Definition: pedump.c:58
#define _countof(array)
Definition: sndvol32.h:70
TCHAR * cmdline
Definition: stretchblt.cpp:32
STRSAFEAPI StringCchPrintfW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszFormat,...)
Definition: strsafe.h:530
STRSAFEAPI StringCchCatW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:325
STRSAFEAPI StringCchCopyW(STRSAFE_LPWSTR pszDest, size_t cchDest, STRSAFE_LPCWSTR pszSrc)
Definition: strsafe.h:149
uint16_t * PWSTR
Definition: typedefs.h:56
const uint16_t * PCWSTR
Definition: typedefs.h:57
#define HRESULT
Definition: msvc.h:7
#define WINAPI
Definition: msvc.h:6
#define E_ACCESSDENIED
Definition: winerror.h:4116
#define MAKEINTRESOURCEA(i)
Definition: winuser.h:581